Что выведет код Junior Итераторы и генераторы обновлено

Ленивый бесконечный генератор

Вопрос

Что выведет код? По строке на каждый вывод.

function* naturals() {
  let n = 1;
  while (true) {
    console.log('gen ' + n);
    yield n++;
  }
}
for (const n of naturals()) {
  if (n > 2) break;
  console.log('use ' + n);
}

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

Напишите, что выведет код: каждый вывод с новой строки.

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

Коротко

Код выведет: gen 1, use 1, gen 2, use 2, gen 3. Генератор выполняет тело только по запросу: каждая итерация цикла вызывает next(), генератор печатает gen n и останавливается на yield.

Что выведет

gen 1
use 1
gen 2
use 2
gen 3

Разбор

Генератор выполняет тело только по запросу: каждая итерация цикла вызывает next(), генератор печатает gen n и останавливается на yield. Потом цикл печатает use n. Вывод чередуется. На третьем шаге генератор успевает напечатать gen 3, а цикл видит 3 > 2 и выходит. Бесконечный while (true) не вешает программу, потому что выполняется лениво.

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

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