forEach () مقابل مقابل مقابل حلقات for-in

إليك ملخصًا موجزًا ​​للاختلافات بين forEach () ، و for-in ، و for-of-loops لإبقائها في متناول اليد كمرجع.

forEach ()

تنفذ طريقة النموذج الأولي * forEach () ، المقدمة في ES5 ، وظيفة رد اتصال متاحة (دالة تنتقل إلى دالة أخرى كوسيطة) مرة واحدة لكل قيمة في Array ، Map (تتكون من أزواج قيمة المفتاح) ، Set ، NodeList ( غالبًا ما يتم إرجاع كائن يشبه الصفيف بواسطة Document.querySelectorAll ()) أو HTMLCollection (كائن يشبه الصفيف غالبًا ما يتم إرجاعه بواسطة كائنات Document.getElementsByClassName ()) ، بترتيب تصاعدي.

myArray.forEach (دالة (قيمة) {
    // افعل اشياء
})؛

يستغرق رد اتصال دالة كمعلمة ، مع معالجة القيمة الحالية في الصفيف كوسيطة لها. (هناك أيضًا ثلاث وسيطات اختيارية: قيمة الفهرس الحالية ، يتم تطبيق الصفيف forEach () على ، وقيمة لاستخدام مثل هذا [الكائن المرجعي].)

إنها أكثر إيجازًا إلى حد ما من الكلاسيكية للحلقة (التي كانت موجودة لفترة أطول من ذلك بكثير). ومع ذلك ، لا يمكنك استخدام فاصل العبارات للخروج من الحلقة ، أو الاستمرار في تخطي التكرار ، أو العودة لإرجاع قيمة (والخروج من الحلقة). تقوم بإرجاع غير محدد.

لاستخدام forEach () للتكرار فوق كائن NodeList أو HTMLCollection ، لاحظ أنك ستحتاج أولاً إلى تحويله إلى كائن Array باستخدام Array.from ().

* النموذج الأولي هو شيء ترثه كل كائنات JavaScript (المتغيرات في كائن) والأساليب (الوظائف في كائن) منه. على سبيل المثال ، كائنات Array ترث من Array.prototype.

قراءة المزيد
Array.prototype.forEach ()
Set.prototype.forEach ()
Map.prototype.forEach ()
NodeList.prototype.forEach ()

لفي

ينشئ عبارة for-in حلقة تكرار يتكرر عبر كافة الخصائص غير القابلة للتخصيص للرمز ، وأحيانًا بترتيب تعسفي.

لـ (متغير في الكائن) {
  // افعل اشياء
}

ما هي خصائص لا تعد ولا تحصى؟
الكائنات هي مجموعات من الخصائص ، ولكل خاصية مجموعة خاصة بها من الخصائص الداخلية التي لا يمكن للمستخدم الوصول إليها ولكن يتم استخدامها بواسطة محرك JavaScript. يتم الإشارة إليها بأقواس مربعة مزدوجة: [[خاصية]].

يحتوي كل كائن على خاصية خاصية [[Enumerable]] تحتوي على قيمة منطقية سواء أكانت صحيحة أم خاطئة ، والتي يمكنك تحديدها باستخدام الخاصية propertyIsEnumerable (). إذا كانت القيمة صحيحة ، فسيكون الكائن قابلًا للتعداد ، وبالتالي (على افتراض أنه ليس رمزًا) سيتم تكراره في حلقة for-in.

بالإضافة إلى الخصائص القابلة للتعداد ذات القيمة [[Enumerable]] للخصائص الخاطئة المظللة ، مما يعني أن الخصائص التي يتم تجاوزها بخصائص نفس الاسم للكائنات المنحدرة (الخصائص الأقرب من الكائن في سلسلة النموذج الأولي لها الأسبقية على خصائص النماذج الأولية) تكررت أكثر.

استخدام الحالات تشمل ...

  • خصائص كائن السلسلة. هذا هو ما صمم ل.
  • كائنات الصفيف ، ولكن هذه ليست على الأرجح فكرة جيدة: بالنسبة لأحد ، يمكن أن يحدث في بعض الأحيان بترتيب تعسفي. ثانياً ، ستكون القيمة المعينة لمؤشر سلسلة ؛ إذا كنت تريد إجراء الحساب ، فأنت تقوم بحساب سلسلة (على سبيل المثال ، 5 + "5" = "55").
  • سلسلة * الكائنات. كل حرف في سلسلة لديه فهرس ، والذي هو خاصية قابلة للتعداد في شكل عدد صحيح.

* جافا سكريبت يحول تلقائيا بين الكائنات سلسلة والسلسلة البدائية. وبالتالي ، يمكنك استدعاء أي من الأساليب المساعدة للكائن سلسلة على بدائية سلسلة.

قراءة المزيد
ل... في
Object.prototype.propertyIsEnumerable ()

لل

المقدمة في ES6 ، تُنشئ for-of loop حلقة تتكرر على الكائنات القابلة للتكرار (انظر أدناه للتوضيح) بالترتيب القابل للتكرار. الاستخدام الشائع هو تنفيذ الحلقات خلال القيم في الصفيف ، لكنه يعمل أيضًا على معظم الكائنات المشابهة للصفيف.

لـ (متغير التكرار) {
  // افعل اشياء
}

له فوائد كبيرة على for-in و forEach ():

  • بخلاف forEach () ، يمكنك استخدام فاصل ومتابعة وإرجاع
  • ميزتان رئيسيتان لـ for-in: واحد ، فهو يزور مؤشرات مجموعة مصفوفة بترتيب رقمي (تصاعدي) ، واثنان ، لا يتم تحويل مؤشرات المصفوفات إلى سلاسل ، لذلك يمكنك إجراء حسابي

إذا كنت ترغب في تنفيذ حلقة فوق خصائص كائن ما ، فإما أن تستخدم for-in (هذا هو الغرض منه) ، أو يمكنك بدلاً من ذلك استخدام الأسلوب Object.keys ().

ما هو كائن قابل للتغيير؟

لست متأكدًا من "الكائن القابل للتكرار"؟ حسنًا ، أضاف ES6 بروتوكولين: البروتوكولات القابلة للتكرار والتكرار ، والتي تعتبر مفتاحًا لفهم ذلك.

بروتوكول التكرار
يسمح البروتوكول القابل للتكرار لعناصر JavaScript بتحديد سلوك التكرار الخاص بهم أو تخصيصه.

لكي يتم اعتباره قابلاً للتكرار ، يجب أن يطبق الكائن طريقةiterator: يجب أن يحتوي هذا العنصر أو أحد الكائنات في سلسلة النموذج الأولي الخاص به على خاصية بها مفتاحiterator ، والذي يتوفر عبر Symbol.iterator الثابت.

في بداية تنفيذ حلقة for-of loop ، يتم استدعاء أسلوبiterator الخاص بالكائن باستخدام وسيطات صفرية ، مع إعادة كائن التكرار الذي يتم استخدامه للحصول على القيم المراد تكرارها.

بروتوكول التكرار
يعرّف بروتوكول التكرار طريقة قياسية لإنتاج سلسلة من القيم (إما محدودة أو غير محدودة).

التكرار هو كائن يتوافق مع بروتوكول التكرار. يتم تحقيق ذلك عن طريق توفير أسلوب التالي () ، والذي يحتوي على وسيطات صفرية وإرجاع كائن بخاصيتين:

  1. القيمة: البيانات التي تمثل القيمة التالية في تسلسل القيم داخل الكائن
  2. تم: منطقي يمثل ما إذا كان التكرار قد انتهى من متابعة تسلسل القيم

كائنات تكرارية

  • العناصر القابلة للتكرار المضمنة: كائنات String و Array و TypedArray و Map و Set (هذه الكائنات مضمنة لأن كل كائن من كائنات النموذج الأولي الخاص به يطبق أسلوبiterator)
  • كائنات NodeList
  • كائنات المولدات (جميع التكرارات التي تم إنشاؤها بواسطة المولدات هي أيضًا عناصر قابلة للتكرار ، حيث تقوم المولدات بتعيين خاصية Symbol.iterator افتراضيًا)
  • حجج تشبه المصفوفة
  • التكرارات المعرفة من قبل المستخدم (يمكن إنشاء هذه عن طريق تحديد طريقة باستخدام مفتاح Symbol.iterator لتتوافق مع البروتوكول القابل للتكرار وللتوافق مع بروتوكول التكرار أيضًا ، مع إعادتها إلى كائن باستخدام طريقة تسمى next () بـ اثنين من الخصائص ، والقيمة والقيام به)

قراءة المزيد
ل... من
Symbol.iterator
بروتوكولات التكرار