معرفة نوع قطعة البيانات أمر مهم غالبًا لكي يعمل الكود بسلاسة وبدون أخطاء.
توفّر JavaScript عدة طرق للتحقق من نوع قيمة أو كائن.
قد تكون آليات التحقق من الأنواع في JavaScript غير موثوقة إلى حد ما.
ومن أجل أمان أفضل للأنواع وأنواع أقوى، يحسن بك على الأرجح أن تستخدم TypeScript، وهي لغة مبنية على JavaScript لكن بصيغة الأنواع الخاصة بلغة ذات أنواع ثابتة.
typeof
يُرجع عامل typeof نوع معامله.
ويكون الناتج سلسلة نصية تطابق اسم أحد أنواع البيانات الأولية، باستثناء "null".
وقد يكون أيضًا "function" أو "object".
typeof undefined;
// => "undefined"
typeof true;
// => "boolean"
typeof 42;
// => "number"
typeof 'Hello, World!';
// => "string"
typeof function () {
return 'Hello, World';
};
// => "function"
typeof [1, 2, 3, 4];
// => "object"
typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"
وذلك [لأسباب تاريخية][typeof null is "object"].
instanceof
للتحقق من نوع كائن، يمكنك استخدام عامل instanceof.
وهو يُقيَّم إلى boolean حسب ما إذا كان المعامل الثاني مُدرجًا ضمن سلسلة النماذج الأولية للمعامل الأول.
وللتوضيح، سيُرجع instanceof ما إذا كان المعامل الأول مثيلًا للمعامل الثاني أو لأحد أصنافه الفرعية.
يعمل instanceof مع الكائنات فقط.
class Beverage {
// ...
}
// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
// ...
}
const java = new Coffee();
java instanceof Coffee;
// => true
java instanceof Beverage;
// => true
يمتلك الصنف Array طريقة تُدعى Array.isArray() تتحقق مما إذا كان وسيطها مصفوفة.
وبينما لا يعمل instanceof Array مع مصفوفة أُنشئت في بيئة مختلفة مثل iframe داخل صفحة ويب، فإن Array.isArray() يعمل.
وذلك لأن الصنف Array يمتلك مُنشئًا مختلفًا في كل بيئة، ولكل iframe بيئته الخاصة، ما يعني أن الدالة في سلسلة النماذج الأولية ستكون مختلفة، فيفشل instanceof Array.
ويستطيع Array.isArray() تجاهل ذلك، ويُفضَّل استخدامه دائمًا عند الإمكان.
كما يمكنه أيضًا تجنّب النتائج الإيجابية الكاذبة حين لا يكون الكائن في الحقيقة Array، وإنما يحمل Array في سلسلة النماذج الأولية الخاصة به.
({ __proto__: Array.prototype }) instanceof Array
// => true
Array.isArray({ __proto__: Array.prototype })
// => false
in
يُرجع عامل in ما إذا كان المعامل الأول خاصيةً في المعامل الثاني.
وهو لا يتحقق من أن للخاصية قيمة معرّفة.
فالخاصية المضبوطة على undefined سيكتشفها in رغم ذلك.
class Coffee {
constructor() {
this.temperature = 'hot';
this.isDarkMatter = undefined;
}
coolDown() {
this.temperature = 'warm';
}
}
const espresso = new Coffee();
'temperature' in espresso;
// => true
'color' in espresso;
// => false
'isDarkMatter' in espresso;
// => true
سيُرجع in القيمة true للخصائص والطرق الموروثة.
"coolDown" in espresso
// => true
"constructor" in espresso
// => true
ولتجنّب ذلك، استخدم Object.hasOwn().
Object.hasOwn()
تُرجع الطريقة Object.hasOwn() ما إذا كان الكائن المحدد يملك الخاصية المعطاة (أي أنها ليست موروثة وليست طريقة).
class Coffee {
constructor() {
this.temperature = 'hot';
}
coolDown() {
this.temperature = 'warm';
}
}
const cappuccino = new Coffee();
Object.hasOwn(cappucino, 'temperature');
// => true
Object.hasOwn(cappucino, 'constructor');
// => false
Object.hasOwn(cappucino, 'coolDown');
// => false