Выбор ответа 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.
Варианты ответа
- Генератор кеширует значения и выдаёт их только один раз на каждый
console.log - Генератор одноразовый: после первого цикла он исчерпан, а итератор у него он самправильный ответ
- Второй цикл выбросил ошибку, которую поглотил первый цикл, и тихо завершился
for...ofпо генератору всегда работает только один раз в модуле
Разбор
Объект-генератор сам является итератором, и его [Symbol.iterator]() возвращает this. Первый цикл довёл его до done: true, второй сразу получает завершённый итератор. Массив же при каждом for...of создаёт новый итератор, поэтому его можно перебирать сколько угодно. Чтобы перебрать генератор снова, вызовите colors() ещё раз или сделайте объект с методом *[Symbol.iterator].
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.