← Назад к вопросам

Зачем нужен генератор?

1.0 Junior🔥 121 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужны генераторы в JavaScript

Генератор — это специальная функция, которая может приостанавливать своё выполнение и возобновлять его позже. Это мощный инструмент для управления асинхронным кодом, итерацией по данным и созданием ленивых вычислений.

Основные причины использования генераторов

1. Ленивое вычисление (Lazy Evaluation) Генераторы вычисляют значения по требованию, а не заранее. Это экономит память и процессор, особенно при работе с большими наборами данных:

// Без генератора — создаёт весь массив сразу
function getNumbers(n) {
  const result = [];
  for (let i = 0; i < n; i++) {
    result.push(i);
  }
  return result;
}
const nums = getNumbers(1000000); // Занимает много памяти

// С генератором — создаёт значения по одному
function* getNumbersLazy(n) {
  for (let i = 0; i < n; i++) {
    yield i;
  }
}
const gen = getNumbersLazy(1000000); // Почти не занимает памяти
const first = gen.next().value; // Получаем только первое значение

2. Итерация (Iteration) Генераторы реализуют протокол итерируемости, позволяя использовать их в цикле for...of:

function* fruits() {
  yield "яблоко";
  yield "груша";
  yield "апельсин";
}

for (const fruit of fruits()) {
  console.log(fruit);
}

3. Асинхронный код (Async/Await альтернатива) До появления async/await, генераторы использовались для управления асинхронными операциями:

function* fetchData() {
  const user = yield fetch(/api/user).then(r => r.json());
  const posts = yield fetch(`/api/user/${user.id}/posts`).then(r => r.json());
  return { user, posts };
}

4. Сохранение состояния (State Management) Генераторы сохраняют локальное состояние между вызовами next():

function* counter() {
  let count = 0;
  while (true) {
    count += yield count; // Получаем значение для добавления
  }
}

const gen = counter();
console.log(gen.next().value);   // 0
console.log(gen.next(5).value);  // 5 (0 + 5)
console.log(gen.next(3).value);  // 8 (5 + 3)

5. Обработка бесконечных последовательностей Генераторы отлично работают с бесконечными потоками данных:

function* fibonacci() {
  let [a, b] = [0, 1];
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

const fib = fibonacci();
for (let i = 0; i < 10; i++) {
  console.log(fib.next().value);
}

Преимущества

  • Экономия памяти — вычисление по требованию
  • Чистаемый код — логика итерации встроена
  • Контроль потока выполнения — пауза и продолжение
  • Удобство — интегрируются с for...of и спредом

Сегодня в современном JavaScript генераторы менее популярны благодаря async/await, но они по-прежнему полезны для работы с итераторами и сложными сценариями управления потоком данных.

Зачем нужен генератор? | PrepBro