يتم استخدام كل من عوامل التشغيل typeof
و instanceof
لتحديد أنواع البيانات، ولكن سيناريوهات استخدامها مختلفة، وتتطلب بعض التفاصيل اهتمامًا خاصًا. دعنا نكتشف ذلك بعد ذلك، ونتقن هذه النقطة المعرفية تمامًا، ولا نخاف بعد الآن من أسئلة القائم بإجراء المقابلة.
typeof
هو عامل تشغيل أحادي يتم وضعه أمام المعامل، والذي يمكن أن يكون من أي نوع. تقوم بإرجاع سلسلة تصف نوع المعامل. يرجى إلقاء نظرة على الكستناء:
const type = typeof 'Long Live China'; نوع 666; //رقم النوع صحيح؛ // منطقي نوع غير محدد // غير محدد نوع الرمز () ؛ // الرمز typeof 1n; typeof () => {}; نوع []؛ // كائن نوع {}؛ نوع السلسلة الجديدة ('xxx')؛ // كائن typeof null; // object
كما يتبين من الأمثلة المذكورة أعلاه، يمكن typeof
فقط تحديد أنواع البيانات والوظائف الأساسية بدقة (الوظائف هي في الواقع كائنات ولا تنتمي إلى نوع بيانات آخر، ولكن يمكن أيضًا تمييزها باستخدام typeof) ولا يمكن يتم تحديد نوع البيانات المرجعية بدقة (كل كائن الإرجاع).
شيء واحد يجب ملاحظته هو أن استدعاء typeof null
يُرجع object
، وذلك لأن القيمة الخاصة null
تعتبر مرجعًا لكائن فارغ (يُسمى أيضًا مؤشر كائن فارغ).
إذا كنت تريد تحديد نوع البيانات المرجعية بدقة، فيمكنك استخدام عامل تشغيل instanceof
.
عامل instanceof
يتم وضعه بعد المعامل وقبل الكائن المحدد. تقوم بإرجاع قيمة منطقية تشير إلى ما إذا كان المعامل هو مثيل للكائن المحدد:
نتيجة const = [] مثيل الصفيف // صحيح شخص ثابت = وظيفة () {}؛ const p = new Person(); p مثيل الشخص // صحيح رسالة ثابتة = سلسلة جديدة('xxx');مثيل الرسالة String؛ // typeof
الحقيقي
سيُرجع النوع الأساسي للمعامل، ومثيل القيمة المنطقية
يمكنه تحديد نوع البيانات المرجعية بدقة، ولكن لا يمكنه تحديد نوع البيانات الأساسي
typeof بشكل صحيح على الرغم من أنه يمكنه تحديد نوع البيانات الأساسي ( باستثناء null) ، ولكن من المستحيل تحديد نوع البيانات المرجعية (باستثناء الوظيفة)
typeof
و instanceof
عيوب معينة ولا يمكنهما تلبية احتياجات جميع السيناريوهات. إذا كنت بحاجة إلى اكتشاف أنواع البيانات بشكل عام، فيمكنك استخدام طريقة Object.prototype.toString.call()
:
Object.prototype.toString.call({}); // "[object Object]" Object.prototype.toString.call([]); // "[مصفوفة الكائنات]" Object.prototype.toString.call(666); // "[رقم الكائن]" Object.prototype.toString.call('xxx'); // "[object String]"
لاحظ أن هذه الطريقة تُرجع سلسلة بتنسيق "[object Object]"
.
لاستخدام أكثر ملاءمة، يمكننا تغليف هذه الطريقة:
function getType(value) { دع النوع = نوع القيمة؛ if (type !== 'object') { // إذا كان نوع بيانات أساسيًا، فارجع مباشرة return type; } // إذا كان نوع بيانات مرجعيًا، فسيتم اتخاذ قرار آخر، وتكون نتيجة الإرجاع المنتظمة هي إرجاع Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); // الرقم getType('xxx'); // سلسلة getType(() => {}); getType([]); // صفيف getType({}); // كائن getType(null);