الكلمات السابقة
الصفيف عبارة عن مجموعة من القيم مرتبة بالترتيب ، وبالنسبة إلى أسماء خاصية الكائن خارج الترتيب. في الأساس ، تستخدم المصفوفات الأرقام كمفاتيح بحث ، بينما تحتوي الكائنات على أسماء سمات محددة من قبل المستخدم. لا تحتوي JavaScript على صفائف ترابطية حقيقية ، ولكن يمكن استخدام الكائنات لتنفيذ وظيفة الترابط
Array () هو مجرد نوع خاص من الكائن () ، أي مثيل Array () هو في الأساس مثيل كائن () مع بعض الوظائف الإضافية. يمكن أن تحتوي المصفوفات على أي نوع من القيم ، والتي يمكن تحديثها أو حذفها في أي وقت ، ويتم ضبط حجم الصفيف ديناميكيًا.
بالإضافة إلى الكائنات ، ربما يكون نوع صفيف الصفيف هو النوع الأكثر استخدامًا في JavaScript. علاوة على ذلك ، تختلف المصفوفات في JavaScript تمامًا عن تلك في معظم اللغات الأخرى. ستقدم هذه المقالة نوع مجموعة الصفيف في JavaScript
إنشاء صفيف
هناك طريقتان لإنشاء صفيف: استخدام بناء الجملة الحرفي واستخدام مُنشئ الصفيف ()
【حرفي】
استخدام Array Distalals هو أسهل طريقة لإنشاء صفيف. عناصر صفيف منفصلة مع فواصل بين قوسين مربعة
var فارغ = [] ؛ // Array بدون عناصر var primes = [2،3،5،7،11] ؛ // صفيف مع 5 قيم
على الرغم من أن صفائف JavaScript يتم طلب قوائم البيانات وكذلك المصفوفات بلغات أخرى ، على عكس اللغات الأخرى ، يمكن لكل عنصر من صفيفات JavaScript الاحتفاظ بأي نوع من البيانات
var misc = [1.1 ، true ، "a"] ؛ // 3 عناصر من أنواع مختلفة
لا يجب أن تكون القيم الموجودة في حرفية الصفيف ثوابت ، ويمكن أن تكون أي تعبير
var base = 1024 ؛ var table = [base ، base+1 ، base+2 ، base+3] ؛
يمكن أن يحتوي على حرفي كائن أو غيرها من الحرفي
var b = [[1 ، {x: 1 ، y: 2}] ، [2 ، {x: 3 ، y: 4}] ؛إذا كانت عناصر الصفيف لا تزال صفائف ، يتم تشكيل صفيف متعدد الأبعاد
var a = [[1 ، 2] ، [3 ، 4]] ؛
[ملاحظة] عند استخدام تدوين حرفي رقمي ، لن يتم استدعاء مُنشئ الصفيف
【المنشئ】
هناك ثلاث طرق للاتصال بمنشئات
【1】 لا توجد معلمات ، قم بإنشاء صفيف فارغ
// تنشئ هذه الطريقة صفيفًا فارغًا بدون أي عناصر ، أي ما يعادل الكمية المباشرة من الصفيف [] var a = new array () ؛
【2】 هناك معلمة رقمية ، يتم استخدامها لتحديد طول الصفيف
var a = new array (10) ؛ console.log (a) ؛ // [] console.log (a [0] ، A.Length) ؛ // undefined 10
[ملاحظة] إذا كان هناك نوع آخر من المعلمات ، فسيتم إنشاء صفيف يحتوي فقط على تلك القيمة
var a = new array ('10 ') ؛ console.log (a) ؛ // [' 10 '] console.log (a [0] ، A.Length) ؛ // 10 1【3】 عندما تكون هناك معلمات متعددة ، يتم تمثيل المعلمات كعناصر محددة من الصفيف
var a = new array (1،2،3) ؛ console.log (a) ؛ // [1،2،3] console.log (a [0] ، a [1] ، a [2]) ؛ // 1 2 3
عند استخدام مُنشئ الصفيف () ، يمكن حذف المشغل الجديد
var a1 = array () ؛ var a2 = array (10) ؛ var a3 = array (1،2،3) ؛ console.log (a1 ، a2 ، a3) ؛ // [] [] [1،2،3]
طبيعة الصفيف
المصفوفات هي مجموعة من القيم مرتبة بالترتيب. في جوهرها ، المصفوفات هي كائنات خاصة.
typeof [1 ، 2 ، 3] // "كائن"
تنعكس خصوصية الصفيف في أن أسماءها الرئيسية هي مجموعة من الأعداد الصحيحة (0 ، 1 ، 2 ...) مرتبة بالترتيب. نظرًا لأن الأسماء الرئيسية لأعضاء الصفيف ، لا يحتاج الصفيف إلى تحديد اسم مفتاح لكل عنصر ، ولكن يجب على كل عضو في الكائن تحديد اسم المفتاح.
var arr = ['a' ، 'b' ، 'c'] ؛ console.log (object.keys (arr)) ؛ // ["0" ، "1" ، "2"] var obj = {name1: "a '، name2:' b '، name3:' c '} ؛المصفوفات هي أشكال خاصة من الأشياء. يشبه الوصول إلى عناصر الصفيف ذات الأقواس المربعة للوصول إلى خصائص الكائنات مع قوسين مربع.
تنص لغة JavaScript على أن الأسماء الرئيسية للكائنات هي سلاسل ، وبالتالي فإن أسماء المصفوفات الرئيسية هي في الواقع سلاسل. السبب في أنه يمكن قراءته بقيم رقمية هو أنه سيتم تحويل أسماء المفاتيح غير المتوفرة إلى سلاسل ثم استخدامها كأسماء السمات
o = {} ؛ // إنشاء كائن عادي o [1] = "واحد" ؛ // فهرس مع عدد صحيح // يتم تحويل اسم المفتاح الرقمي تلقائيًا إلى سلسلة var arr = ['a' ، 'b' ، 'c'] ؛ arr ['0'] // 'a'arr [0] //' a 'ومع ذلك ، من الضروري التمييز بين فهرس الصفيف وأسماء سمات الكائن: جميع الفهارس هي أسماء سمات ، ولكن فقط أسماء سمات عدد صحيح بين 0 ~ 232-2 (4294967294) هي فهارس
var a = [] ؛ // index a ['1000'] = 'abc' ؛ a [1000] // 'abc' // index a [1.00] = 6 ؛ a [1] // 6
[ملاحظة] لا يمكن استخدام القيم الفردية كمعرفات. لذلك ، لا يمكن التعبير عن أعضاء المصفوفة فقط بين قوسين مربعة
var arr = [1 ، 2 ، 3] ؛ arr [0] ؛ // 1arr.0 ؛ // syntaxerror
يمكن فهرسة صفيف باستخدام أرقام سلبية أو غير مستقرة. ومع ذلك ، نظرًا لأنه ليس ضمن نطاق 0 ~ 2 إلى قوة 32 -2 ، فهو مجرد اسم سمة الصفيف ، وليس فهرس الصفيف. الميزة الواضحة هي أنها لا تغير طول الصفيف
var a = [1،2،3] ؛ // اسم السمة a [-1.23] = true ؛ console.log (A.Length) ؛ // 3 // index a [10] = 5 ؛ console.log (A.Length) ؛ // 11 // اسم السمة A
صفائف متناثرة
صفيف متناثر عبارة عن صفيف يحتوي على فهارس متقطعة تبدأ من 0.
【1】 الطريقة الأكثر مباشرة لصنع المصفوفات المتفرقة هي استخدام مشغل الحذف
var a = [1،2،3،4،5] ؛ حذف A [1]
【2】 يمكن حذف قيم العناصر بين فواصل المصفوفات ، ويمكن إنشاء المصفوفات المتفرقة عن طريق حذف قيم العناصر.
var a = [1 ، ، 3،4،5] ؛ console.log (a [1]) ؛ // undefinedConsole.log (1 in a) ؛ // false
[ملاحظة] هناك فرق بين قيمة العنصر المحذوفة وقيمة العنصر التي تكون قيمتها غير محددة.
var a = [1 ، ، 3،4،5] ؛ console.log (a [1]) ؛ // undefinedConsole.log (1 in a) ؛ // falsevar a = [1 ، undefined ، 3،4،5] ؛ console.log (a [1]) ؛
إذا كنت تستخدم الفواصل في نهاية الصفيف ، فهناك اختلافات بين المتصفحات. يتم تجاهل الفاصلة من قبل المتصفح القياسي ، بينما يضيف متصفح IE8 قيمة غير محددة في النهاية
// إخراج المتصفح القياسي [1،2] ، في حين أن إخراج IE8 Browser [1،2 ، غير محدد] var a = [1،2 ،] ؛ console.log (a) ؛ // إخراج المتصفح القياسي 2 ، في حين أن إخراج IE8-Browser 3var a = [،،]
عادة ما تكون المصفوفات المتفرقة بدرجة كافية أبطأ في التنفيذ من المصفوفات الكثيفة ولديها استخدام ذاكرة أعلى ، والوقت للبحث عن العناصر في مثل هذه الصفيف طالما أن الوقت للبحث عن خصائص الكائن العادي
طول الصفيف
كل صفيف له سمة طول ، وهي هذه السمة التي تميزها عن كائنات JavaScript التقليدية. بالنسبة إلى المصفوفات الكثيفة (أي ، غير المسبقة) ، تمثل قيمة سمة الطول عدد العناصر الموجودة في الصفيف ، وقيمته أكبر من أكبر فهرس في الصفيف.
[]
عندما تكون الصفيف عبارة عن صفيف متناثر ، تكون قيمة سمة الطول أكبر من عدد العناصر. وبالمثل ، فإن قيمتها أكبر من أكبر فهرس في الصفيف
[،،].طول؛ //3(ray(10)).length ؛//10var a = [1،2،3] ؛ console.log (A.Length) ؛ // 3delete a [1] ؛ console.log (A.Length) ؛ // 3
تنعكس خصوصية المصفوفات بشكل أساسي في حقيقة أن طول الصفيف يمكن ضبطه ديناميكيًا:
【1】 إذا قمت بتعيين قيمة لعنصر صفيف وفهرس I أكثر من أو يساوي طول الصفيف الحالي ، فسيتم تعيين قيمة سمة الطول على I+1
var arr = ['a' ، 'b'] ؛ arr.length // 2arr [2] = 'c' ؛ arr.length // 3arr [9] = 'd' ؛ arr.length // 10arr [1000] = 'e' ؛ arr.length // 1001
【2】 عند تعيين سمة الطول على عدد صحيح غير سالب أصغر من الطول الحالي ، سيتم حذف العناصر ذات قيمة فهرس الصفيف الحالية أكبر من N
a = [1،2،3،4،5] ؛ // من صفيف 5 عناصر A.Length = 3 ؛ // الآن A IS [1،2،3] A.Length = 0 ؛ // حذف جميع العناصر. A IS [] A.Length = 5 ؛ // الطول هو 5 ، ولكن لا توجد عناصر ، تمامًا مثل الجديد
صفيف (5)
[ملاحظة] طريقة فعالة لمسح الصفيف هي تعيين خاصية الطول على 0
var arr = ['a' ، 'b' ، 'c'] ؛ arr.length = 0 ؛ arr // []
【3】 قم بتعيين قيمة سمة الطول للمصفوفة لتكون أكبر من طولها الحالي. في الواقع هذا لا يضيف عناصر جديدة إلى الصفيف ، فهو يخلق منطقة فارغة في نهاية الصفيف فقط
var a = ['a'] ؛ A.Length = 3 ؛ console.log (a [1]) ؛ // undefinedConsole.log (1 in a) ؛ // false
إذا تم تعيين الطول على قيمة غير قانونية (أي ، قيمة خارج النطاق 0--232-2) ، فسيقوم JavaScript بالإبلاغ عن خطأ
// تعيين القيمة السالبة []
نظرًا لأن الصفيف هو كائن بشكل أساسي ، يمكنك إضافة سمات إلى الصفيف ، لكن هذا لا يؤثر على قيمة سمة الطول
var a = [] ؛ a ['p'] = 'abc' ؛ console.log (A.Length) ؛ // 0a [2.1] = 'abc' ؛ console.log (A.Length) ؛ // 0
تجارة الصفيف
الطريقة الأكثر شيوعا للحلق من خلال عناصر الصفيف باستخدام حلقة
var a = [1 ، 2 ، 3] ؛ for (var i = 0 ؛ i <A.Length ؛ i ++) {console.log (a [i]) ؛}بالطبع ، يمكنك أيضًا استخدام حلقة الوقت
var a = [1 ، 2 ، 3] ؛ var i = 0 ؛ بينما (i <a.length) {console.log (a [i]) ؛ i ++ ؛} var l = a.length ؛ بينما (l--) {console.log (a [l]) ؛}ولكن إذا كانت الصفيف عبارة
// تخطي عنصر غير موجود var a = [1 ،،، 2] ؛ لـ (var i = 0 ؛ i <a.length ؛ i ++) {if (! (i in a)) متابعة ؛ console.log (a [i]) ؛}يمكنك أيضًا استخدام/في الحلقات لمعالجة المصفوفات المتفرقة. تقوم الحلقة بتعيين اسم السمة التعداد (بما في ذلك فهرس الصفيف) إلى متغير الحلقة في وقت واحد. لن يتم اجتياز الفهرس غير الموجود
var a = [1 ،، 2] ؛ لـ (var i in a) {console.log (a [i]) ؛}لأن For/in Loop يمكن أن يعدد أسماء السمات الموروثة ، مثل الطرق المضافة إلى Array.prototype. لهذا السبب ، لا ينبغي استخدام/في الحلقات في المصفوفات ما لم يتم استخدام طرق اكتشاف إضافية لتصفية الخصائص غير المرغوب فيها
var a = [1 ،،، 2] ؛ ab = 'b' ؛ for (var i in a) {console.log (a [i]) ؛ // 1 2 'b'} // skip ivar a = [1 ،،، 2] ؛ ab = 'b' ؛ for (var i in a) {if (string. متابعة ؛ console.log (a [i]) ؛ // 1 2}تتيح مواصفات JavaScript لـ/في الحلقات اجتياز خصائص كائن في أوامر مختلفة. عادةً ما يكون التنفيذ التجاري لعناصر الصفيف في ترتيب تصاعدي ، ولكن لا يمكن ضمان أن يكون هكذا. على وجه الخصوص ، إذا كان لدى صفيف سمات الكائن وعناصر الصفيف ، فمن المحتمل أن تكون أسماء السمات التي تم إرجاعها بالترتيب تم إنشاؤها بدلاً من ترتيب الحجم العددي. إذا كانت الخوارزمية تعتمد على ترتيب اجتياز ، فمن الأفضل عدم استخدام/في الاستخدام العادي للحلقات
صفيف الفصل
تسمى الكائنات ذات سمات الطول وسمات عدد صحيح غير سالبة المقابلة كائنات تشبه الصفيف
!
هناك ثلاثة كائنات صفيف فئة مشتركة:
【1】 الوسيطات كائن
// الوسيطات دالة كائن args () {عودة وسيطات} var arraylike = args ('a' ، 'b') ؛ arraylike [0] // 'a'arraylike.length // 2arraylike مثيل Array // false【2】 الكائن الذي تم إرجاعه بواسطة طريقة DOM (مثل MOTIR.GetElementsByTagName ()) طريقة)
.
【3】 سلسلة
// String 'ABC' [1] // 'b''abc'.length // 3'abc' مثيل Array // false
[ملاحظة] السلاسل هي قيم غير قابلة للتغيير ، لذلك عند النظر إليها على أنها صفائف ، فهي للقراءة فقط. على سبيل المثال ، ستعمل Push () ، sort () ، reverse () ، splice () وطرق الصفيف الأخرى على تعديل الصفيف. أنها غير صالحة على السلسلة وستبلغ عن خطأ
var str = 'abc' ؛ array.prototype.foreach.call (str ، function (chr) {console.log (chr) ؛ // abc}) ؛ array.prototype.splice.call (str ، 1) ؛ console.log (str) ؛ // typeerror:تعمل طريقة شريحة الصفيف على تحويل كائن صفيف الفئة إلى صفيف حقيقي
var arr = array.prototype.slice.call (Arraylike) ؛
يتم تعريف طرق صفيف JavaScript على وجه التحديد على أنها عامة ، لذلك فهي تعمل بشكل صحيح ليس فقط على المصفوفات الحقيقية ولكن أيضًا على كائنات صفيف الفئة. في ecmascript5 ، جميع أساليب الصفيف عامة. في ECMascript3 ، جميع الطرق باستثناء tostring () و tolocalestring () شائعة أيضًا
var a = {'0': 'a' ، '1': 'b' ، '2': 'c' ، length: 3} ؛ array.prototype.join.call (a ، '+') ؛ // 'a+b+c'array.p Rototype.slice.call (a ، 0) ؛ // ['a' ، 'b' ، 'c'] array.prototype.map.call (a ، function (x) {return X.ToupperCase () ؛}) ؛ // ['a' ، 'b' ، 'c']