Выбор ответа Junior Итераторы и генераторы обновлено

Почему второй цикл по генератору пуст

Вопрос

Почему второй цикл ничего не выводит?

function* colors() { yield 'red'; yield 'green'; }
const list = colors();
for (const c of list) console.log(c);
for (const c of list) console.log(c);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Генератор одноразовый: после первого цикла он исчерпан, а итератор у него он сам. Объект-генератор сам является итератором, и его Symbol.iterator возвращает this.

Варианты ответа

  1. Генератор кеширует значения и выдаёт их только один раз на каждый console.log
  2. Генератор одноразовый: после первого цикла он исчерпан, а итератор у него он самправильный ответ
  3. Второй цикл выбросил ошибку, которую поглотил первый цикл, и тихо завершился
  4. for...of по генератору всегда работает только один раз в модуле

Разбор

Объект-генератор сам является итератором, и его [Symbol.iterator]() возвращает this. Первый цикл довёл его до done: true, второй сразу получает завершённый итератор. Массив же при каждом for...of создаёт новый итератор, поэтому его можно перебирать сколько угодно. Чтобы перебрать генератор снова, вызовите colors() ещё раз или сделайте объект с методом *[Symbol.iterator].

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.