المعامل 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
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات