في الواقع، يتم تحليل سلوك الـ for…of بشكل مختلف عند استخدامه في تكرار عناصر مصفوفة JavaScript. عندما تستخدم console.log
لطباعة مصفوفة، يظهر لك العناصر بالإضافة إلى الخصائص المضافة للمصفوفة. ولكن عند استخدام for...of
، يتم تجاوز الخصائص غير القابلة للترتيب (non-enumerable properties)، وهذا يشمل الخصائص التي تم إضافتها مثل array.foo
.
الدورة for...of
تعتمد على البروتوكول Iterable للتنقل عبر العناصر، وهو مخصص للعناصر القابلة للتكرار فقط. الخصائص التي تضاف بشكل غير قابل للتكرار (non-enumerable properties) لن تظهر أثناء تنفيذ هذه الدورة. وهذا هو السبب في عدم ظهور array.foo
أثناء استخدام for...of
.
لفهم ذلك بشكل أعمق، يمكننا النظر إلى كيفية تحقيق الـ for…of داخلياً. عندما يتم تشغيل الـ for…of، يُفترض أن يكون هناك خصائص خاصة في الكائن الذي يتم تكراره تُعرف باسم [Symbol.iterator]
وتقوم بإرجاع مولد Generator، وهو الذي يدير تكرار العناصر.
تمامًا كما يحدث عند استخدام الدورة for...of
، يتم تجاوز الخصائص غير القابلة للترتيب أثناء التنقل. وبما أن خاصية foo
هي غير قابلة للتكرار، فإنها لا تظهر عند استخدام الدورة for...of
.
لتفادي هذه المشكلة وتضمين الخصائص الغير قابلة للترتيب، يمكن استخدام الـ for…in بدلاً من الـ for…of، حيث يعتمد الـ for…in على تكرار الخصائص بشكل عام ولا يتعلق بالقابلية للتكرار. وهكذا يمكنك أن تحصل على array.foo
بسهولة:
javascriptfor (var key in array) {
console.log(array[key]);
}
هذا يمكن أن يظهر لك array.foo
بالإضافة إلى العناصر الأخرى.
المزيد من المعلومات
لفهم المزيد حول هذا الموضوع، يجب أن نتناول بعض المفاهيم الأساسية في لغة JavaScript وكيفية تكرار العناصر.
أولاً وقبل كل شيء، يجب أن نعلم أن JavaScript هي لغة برمجة قائمة على الكائنات (Object-oriented)، وتعتبر المصفوفة (Array) ككائن أيضاً. وفي JavaScript، يمكن للكائنات أن تحتوي على خصائص (Properties) يمكن إضافتها وحذفها.
عند استخدام console.log
لطباعة المصفوفة array
، فإنه يظهر لك العناصر بالإضافة إلى الخصائص التي تم إضافتها، مثل array.foo
و item
في هذه الحالة.
الدورة for...of
هي جزء من تقنية تُسمى “Iteration Protocol” في JavaScript، وتُستخدم للتنقل عبر العناصر القابلة للتكرار في هياكل بيانات مثل المصفوفات. وهي تعتبر أكثر بساطة وأقل تعقيدًا من الدورة for...in
، التي تُستخدم لتكرار خصائص الكائنات.
الـ Iteration Protocol يعتمد على وجود خاصية Symbol.iterator
في الكائن، والتي تُعيد مرجعًا إلى مولد (Generator) يدير عملية التكرار. هذا يشمل القدرة على تجاوز العناصر القابلة للترتيب فقط.
للتعامل بشكل أفضل مع خصائص الكائنات غير القابلة للتكرار، يمكن استخدام الدورة for...in
التي تتيح لك تكرار جميع الخصائص بما في ذلك تلك التي ليست قابلة للترتيب.
أخيرًا، يُفضل دائمًا فهم كيفية عمل اللغة والتفاعل مع مفاهيمها المختلفة لضمان كتابة رمز قابل للصيانة والفهم.