المعامل typeof
في JavaScript
المعامل typeof
يُعيد سلسلةً نصية تُشير إلى نوع القيمة التي تليه.
البنية العامة
typeof operand
operand
تعبير يُمثِّل كائنًا أو نوع بيانات أوليّ الذي نريد إعادة نوعه.
الوصف
الجدول الآتي يُلخِّص القيم التي يمكن أن يُعيدها المعامل typeof
:
النوع | النتيجة |
---|---|
undefined
|
"undefined"
|
null
|
"object" (انظر الأمثلة)
|
Boolean
|
"boolean"
|
Number
|
"number"
|
String
|
"string"
|
Symbol (جديد في ECMAScript 2015)
|
"symbol"
|
Function
|
"function"
|
أي كائن آخر | "object"
|
أمثلة
// الأعداد
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof(42) === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // على الرغم أنَّه "Not-A-Number"
typeof Number(1) === 'number'; // لا تستخدم هذه الصيغة
// السلاسل النصية
typeof '' === 'string';
typeof 'bla' === 'string';
typeof '1' === 'string'; // الأعداد الموجودة داخل السلاسل النصية هي سلاسل نصية
typeof (typeof 1) === 'string'; // نوع typeof هو سلسلة نصية
typeof String('abc') === 'string'; // لا تستخدم هذه الصيغة
// القيم المنطقية
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // لا تستخدم هذه الصيغة
// الرموز
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
// الكائنات
typeof {a: 1} === 'object';
// use Array.isArray or Object.prototype.toString.call
// to differentiate regular objects from arrays
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// لا تستخدم الأشكال الآتية
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';
// الدوال
typeof function() {} === 'function';
typeof class C {} === 'function';
typeof Math.sin === 'function';
القيمة null
typeof null === 'object';
في أوّل تطبيق للغة JavaScript، كانت القيم في JavaScript تُمثَّل بالنوع والقيمة، وكان نوع الكائنات مرتبطًا بالرقم 0
، وكانت تُمثَّل القيمة null
كمؤشِّر NULL (الذي قيمته هي 0x00
في أغلبية المنصات)، وبالتالي كان للقيمة null
النوع 0
، والنوع 0
يُمثِّل الكائنات، لهذا السبب كانت نتيجة typeof
للقيمة null
هي object
(المصدر).
أُقتِرَح حلٌّ للمشكلة لمعيار ECMAScript، لكنه رُفِضَ، وكان سيُنتِج typeof null === 'null'
.
استخدام المعامل new
جميع الدوال البانية التي تُهيّئ باستخدام الكلمة المحجوزة new
سيكون لها النوع object
:
var str = new String('String');
var num = new Number(100);
typeof str; // 'object'
typeof num; // 'object'
باستثناء الدالة البانية Function
المُضمَّنة في JavaScript:
var func = new Function();
typeof func; // 'function'
المناطق الميتة زمنيًا
قبل ECMAScript 2015، كان من المضمون أن يُعيد المعامل typeof
سلسلةً نصيةً لأي تعبير يُمرَّر إليه، لكن مع إضافة المتغيرات ذات المجال الكتلي والتي لا يمكن استخدامها قبل التصريح عنها: let
و const
، فإنَّ استخدام المعامل typeof
على متغيرات let
و const
قبل التصريح عنها سيؤدي إلى رمي الخطأ ReferenceError
؛ وهذا يختلف عن المتغيرات غير المُصرَّح عنها عبر var
. تذكَّر أنَّ المتغيرات ذات المجال الكتلي تكون في «منطقة ميتة زمنيًا» (temporal dead zone) من بداية الكتلة التي ستُعرَّف فيها إلى حين تعريفها، وسيُرمى خطأٌ إن حاولنا الوصول إليها:
typeof undeclaredVariable === 'undefined'; // true
typeof newLetVariable; let newLetVariable; // ReferenceError
typeof newConstVariable; const newConstVariable = 'hello'; // ReferenceError
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 3rd Edition.
- معيار ECMAScript 1st Edition .