تايب سكريبت - متى تستخدم Iterator بدلاً من تراكيب التكرار العادية - جافاسكريبت


لقد كنت أقرأ مقالات حول المكررات و القابلة للتكرار في ES6. لقد رأيت مثالًا واحدًا كما هو أدناه.

let someArr = [1, 2, 3, 4];
let iteratorVar = someArr[Symbol.iterator]();

console.log(iteratorVar.next().value); // If we log for 5 times, it will print all array elements. 

لكن شكوكي هي أننا يمكننا ببساطة استخدام حلقات for أو while وغيرها للحصول على كل عنصر من المصفوفة كما هو موضح أدناه

for (let i = 0; i < someArr.length; i++) {
  console.log(someArr[i]);
}

إذاً، ما هي فائدة استخدام الكائنات القابلة للتكرار والمكررات مقارنةً بالبنى الحلقية العادية مثل for و while وما إلى ذلك...

لم أحصل على أي توضيح في المقالات التي قرأتها. شكراً لمساعدتك.

الإجابة رقم 1

يتم تعريف عدد من الميزات في اللغة من حيث المكررات.

يشمل هذا بناء الجملة مثل حلقة for..of وكذلك الانتشار (...values) للمصفوفات والخرائط والمجموعات.

مع ذلك، نادراً ما يكون لديك سبب للتعامل مباشرة مع المُكرّر نفسه.

ومع ذلك، هناك حالات يكون فيها القدرة على القيام بذلك ضرورية.

على سبيل المثال، تخيل أننا نريد كتابة دالة zip التي تجمع العناصر المتناظرة من عدة كائنات قابلة للتكرار.

نظرًا لأن الكائنات القابلة للتكرار يمكن أن تكون لانهائية، لا يمكننا إنشاء مصفوفة وإرجاعها. من ناحية، لا يمكننا تخصيص كمية لا نهائية من الذاكرة، ومن ناحية أخرى لا يمكننا تحديد مدخلاتنا لتكون سلسلات محدودة.

في هذه الحالة، التلاعب المباشر بالمكرر يعطينا بالضبط ما نحتاجه

function* zip(iterables = []) {
  if (iterables.length < 2) {
    throw RangeError('at least 2 iterables must be provided');
  }

  const iterators = iterables.map(iterable => iterable[Symbol.iterator]);

  while (true) {
    const iterations = iterators.map(iterator => iterator.next());
    if (iterations.some(iteration => iteration.done)) {
      return;
    }

    yield iterations.map(iteration => iteration.value);
  }
}

هذا zip يأخذ مصفوفة من عنصرين أو أكثر قابلين للتكرار ويستهلكهم عنصرًا بعنصر. يقوم بإرجاع عناصرهم المقابلة معًا ويتوقف عندما ينتهي أي منهم.

المثال أعلاه معقد إلى حد ما لكنه يتميز بعدم تصنعه.

هذه الأنواع من السيناريوهات مهمة لكنها نادرة نسبياً، مما يجعل الاستخدام المباشر للمكررات استثناءً بدلاً من قاعدة.