المسارات
/
JavaScript
JavaScript
/
المنهج
/
التحقق من الأنواع
ال

التحقق من الأنواع في JavaScript

1 تمرين

نبذة عن التحقق من الأنواع

معرفة نوع قطعة البيانات أمر مهم غالبًا لكي يعمل الكود بسلاسة وبدون أخطاء.

توفّر JavaScript عدة طرق للتحقق من نوع قيمة أو كائن.

Note

قد تكون آليات التحقق من الأنواع في 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
Advanced

يمتلك الصنف 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
Note

سيُرجع 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
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم التحقق من الأنواع