في es6، يمكنك استخدام طريقة isArray() الخاصة بـ Array لتحديد ما إذا كان المتغير مصفوفة أم لا. يتم استخدام هذه الطريقة لتحديد ما إذا كان الكائن من نوع مصفوفة أم لا مصفوفة، فإنها ترجع صحيحا، وإلا فإنها ترجع كاذبة.
بيئة تشغيل هذا البرنامج التعليمي: نظام Windows 7، الإصدار 6 من ECMAScript، كمبيوتر Dell G3.
تحديد ما إذا كان المتغير عبارة عن مصفوفة في ES5 في ES5
، لدينا على الأقل الطرق الخمس التالية لتحديد ما إذا كانت القيمة عبارة عن مصفوفة:
var a = []; // 1. بناءً على مثيل مثيل للصفيف؛ // 2. بناءً على المنشئ a.constructor === Array; // 3. بناءً على Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. بناءً على getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5. بناءً على Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]'؛
أعلاه، باستثناء Object.prototype.toString
، لا يمكن للطرق الأخرى تحديد نوع المتغير بشكل صحيح.
كما تعلمون، بيئة تشغيل التعليمات البرمجية معقدة للغاية، وقد يستخدم المتغير جميع أنواع الحيل لإرباك منشئه. دعونا نرى
فار أ = { __proto__: Array.prototype }; // حاول تشغيل الأكواد التالية في وحدة التحكم على التوالي // 1. بناءً على مثيل of مثيل للصفيف؛ // => صحيح // 2. بناءً على المنشئ a.constructor === Array; // 3. بناءً على Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. بناءً على getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => صحيح
أعلاه، جميع الطرق الأربعة ستعود صحيحة لماذا؟ لقد قمنا للتو بتحديد السمة __proto__ للكائن يدويًا على أنها Array.prototype، مما تسبب في وراثة الكائن لكائن Array، مما أدى إلى انهيار مخطط الحكم القائم على الميراث على الفور.
ليس هذا فحسب، بل نعلم أيضًا أن المصفوفة عبارة عن بيانات كومة، ويشير المتغير فقط إلى عنوانه المرجعي، لذا يختلف العنوان المشار إليه بواسطة كائن المصفوفة في كل صفحة. بالنسبة للمصفوفة المُعلن عنها في إطار iframe، يكون مُنشئها هو كائن Array في إطار iframe. إذا تم الإعلان عن صفيف x في iframe وتم تعيينه للمتغير y للصفحة الرئيسية، فسيتم استخدام مثيل y للصفيف في الصفحة الأصلية، ويجب أن تكون النتيجة خاطئة. يقوم الأخير بإرجاع سلسلة، لذلك لا توجد مشكلة مرجعية. في الواقع، التفاعلات بين الصفحات أو الأنظمة المتعددة تكون ممكنة فقط باستخدام السلاسل.
تحديد ما إذا كان المتغير عبارة عن مصفوفة في ES6
نظرًا للاستخدام الشائع للمصفوفات، تتم إضافة طريقة Array.isArray في ES6. يعد استخدام هذه الطريقة لتحديد ما إذا كان المتغير مصفوفة أمرًا بسيطًا للغاية، كما يلي:
Array.isArray ([])؛ // => صحيح Array.isArray({0: 'a', length: 1}); // => false
في الواقع، يعد استخدام Object.prototype.toString
لتحديد نوع القيمة أيضًا معيارًا للمكتبات الرئيسية الرئيسية. ولذلك فإن polyfill لـ Array.isArray عادةً ما يبدو كالتالي:
if (!Array.isArray){ Array.isArray = وظيفة(arg){ return Object.prototype.toString.call(arg) === '[مصفوفة الكائنات]'; }; }