على عكس لغة Java ، تحتوي المصفوفات في JavaScript على ثلاث ميزات:
1. لا يوجد نوع. يمكن أن يكون أعضاء الصفيف من أي نوع ، ويمكن أيضًا أن يتكون الصفيف نفسه من العديد من أنواع الأعضاء المختلفة.
2. الطول متغير. يمكن تغيير طول الصفيف ديناميكيًا ، لذلك لا توجد مشكلة في حدود الوصول إلى الصفيف في JavaScript.
3. التوقف. يمكن أن تكون مواقف الأعضاء في الصفيف مستمرة (0 ، 1 ، 2 ، 3 ...) أو متقطعة. أي صفيف لديه سمة تسمى الطول. عندما يكون أعضاء الصفيف مستمرًا ، تكون قيمة الطول متوافقة مع عدد أعضاء الصفيف ؛ عندما لا يكون أعضاء الصفيف مستمرًا ، تكون قيمة الطول أكبر من عدد أعضاء الصفيف. بالمقارنة مع المصفوفات المستمرة ، فإن أداء القراءة والكتابة للمصفوفات المتقطعة أسوأ.
تجربة:
نسخة الكود كما يلي:
var o = [42 ، "Sample Text" ، {x: 88}] ؛ // javaScript Array غير مُعدة.
console.log (O) ؛ // [42 ، "Sample Text" ، Object {X = 88}]
o [3] = 27 ؛ // javaScript Array ديناميكية.
console.log (O) ؛ // [42 ، "Sample Text" ، Object {X = 88} ، 27]
o [5] = 99 ؛ // javaScript Array متناثر.
console.log (O) ؛ // [42 ، "Sample Text" ، Object {x = 88} ، 27 ، undefined ، 99]
كما يتضح من المثال أعلاه ، بالنسبة للمصفوفات المتقطعة ، ستعود JavaScript غير محددة عند الوصول إلى العضو المفقود. إذا كانت الصفيف مستمرة ، ولكن أحد أعضائها غير محدد ، فإن نتيجة الوصول إلى الصفيف هي نفسها:
نسخة الكود كما يلي:
var a = [42 ، "sample text" ، {x: 88} ، 27 ، undefined ، 99] ؛
console.log (a) ؛ // [42 ، "Sample Text" ، Object {x = 88} ، 27 ، undefined ، 99]
الصفيف متقطع وله أعضاء مفقودون ، وهو نفس الصفيف مستمر ولكن لديه أعضاء غير محددين. في كلتا الحالتين ، تكون نتيجة الوصول إلى محتوى الصفيف هي نفسها. ولكن لا تزال هناك بعض الاختلافات الدقيقة بين الاثنين ، والتي تتجلى بشكل رئيسي في الوصول إلى مفتاح الصفيف:
نسخة الكود كما يلي:
console.log (4 in o) ؛ // false
console.log (4 في أ) ؛ // صحيح
يمكن ملاحظة أنه على الرغم من أن النتائج التي تم الحصول عليها عن طريق الوصول إلى المحتوى في هاتين الحالتين هي نفسها ، فإن آليتها الداخلية مختلفة تمامًا: عندما تكون الصفيف متقطعًا ، فإن عضوًا معينًا مفقودًا ، لذلك عند الوصول إلى العضو ، يعيد JavaScript غير محدد ؛ عندما تكون الصفيف مستمرة ، يوجد جميع الأعضاء ، لكن قيم بعض الأعضاء مميزة نسبيًا وغير محددة.
من المثال أعلاه ، يمكننا أيضًا أن نرى أن جوهر المصفوفات في JavaScript هو مجرد كائن ذو أرقام كمفاتيح ، ولا يوجد فرق بين القيم الرئيسية والكائنات العادية. في الواقع ، عند قراءة وكتابة مجموعة ، ستحاول JavaScript تحويل المعلمات إلى أعداد صحيحة إيجابية. إذا نجح التحويل ، فسيتم تنفيذ عملية الصفيف (تحديث خاصية الطول تلقائيًا للمصفوفة). إذا فشلت ، سيتم تحويل المعلمات إلى سلسلة ثم قراءة وكتابة كائن عادي. بالطبع ، في تنفيذ مترجم JavaScript ، يتم إجراء الكثير من تحسينات الأداء لميزة المصفوفات باستخدام أرقام كمفاتيح. لذلك ، في الاستخدام الفعلي ، إذا كانت مفاتيح الكائن كلها أرقام ، فإن استخدام كائن الصفيف سيحصل مباشرة على نتائج أكثر كفاءة.
في عملية تحديد صفيف ، يسمح JavaScript بالظهور الفواصل الإضافية ، كما يسمح لأعضاء الصفيف المفقودين بين فواصلين:
نسخة الكود كما يلي:
var x = [1،2،3 ،] ؛ // سيتم حذف الفاصلة الخلفية.
console.log (X.Length) ؛ // 3
var y = [1 ، ، 3] ؛ // يمكن تفويت العضو.
console.log (y) ؛ // [1 ، غير محدد ، 3]
console.log (1 في y) ؛ // false
console.log (y.length) ؛ // 3
لإنشاء صفيف ، يدعم JavaScript أربع طرق:
1. استخدم الحرفيين (مثل تعبيرات الأقواس في الأمثلة المذكورة أعلاه) لإنشاء كائن صفيف مباشرة.
2. استخدم مُنشئ الصفيف () ولا تمر في أي معلمات. في هذه الحالة ، يتم إنشاء صفيف فارغ بنفس تأثير [].
3. استخدم المركب () المُنشئ لتمرير عدد صحيح موجب مثل طول الصفيف. في هذه الحالة ، ستحتفظ JavaScript بمساحة الذاكرة المقابلة لتخزين هذه الصفيف. تجدر الإشارة إلى أنه لم يتم تعريف مفاتيح الصفيف في هذا الوقت ، أي أنه لا يوجد أعضاء في المصفوفة. تأثيرها يعادل تأثير [،،،]]
4. استخدم مُنشئ الصفيف () لتمرير أعضاء المصفوفة.
تجربة:
نسخة الكود كما يلي:
var z = صفيف جديد (10) ؛ // الذاكرة المسبقة ، ولكن لا يتم تعريف أي فهرس حتى الآن.
console.log (3 في z) ؛ // false
var m = new array (42 ، 33 ، 99 ، "test" ، {k: 99}) ؛
console.log (m) ؛ // [42 ، 33 ، 99 ، "test" ، Object {k = 99}]
في ecmascript 5 Standard ، يمكن استخدام Array.isarray () لتحديد ما إذا كان الكائن عبارة عن صفيف:
نسخة الكود كما يلي:
array.isarray ([]) ؛ // true
Array.isarray ({}) ؛ // false