Spec-Zone.ru › JavaScript

Генератор

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с сентября 2016 года.

Объект Generator возвращается функцией-генератором и соответствует как протоколу итерируемого объекта, так и протоколу итератора.

Generator является подклассом класса Iterator.

Конструктор

В JavaScript нет сущности, соответствующей конструктору Generator. Экземпляры Generator должны возвращаться из функций-генераторов:

function* generator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generator(); // "Generator { }"

console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3

Существует только скрытый объект, который является прототипом, общим для всех объектов, созданных функциями-генераторами. Этот объект часто стилизуют как Generator.prototype, чтобы он выглядел как класс, но более правильно его назвать GeneratorFunction.prototype.prototype, потому что GeneratorFunction является реальной сущностью JavaScript. Чтобы понять цепочку прототипов экземпляров Generator, см. GeneratorFunction.prototype.prototype.

Свойства экземпляра

Эти свойства определены в Generator.prototype и общие для всех экземпляров Generator.

Generator.prototype.constructor

Конструктор, создавший экземпляр объекта. Для экземпляров Generator начальным значением является GeneratorFunction.prototype.

Примечание: Объекты Generator не хранят ссылку на функцию-генератор, которая их создала.

Generator.prototype[Symbol.toStringTag]
Начальным значением свойства [Symbol.toStringTag] является строка "Generator". Это свойство используется в Object.prototype.toString().

Методы экземпляра

Также наследует методы экземпляра от родительского Iterator.

Generator.prototype.next()
Возвращает значение, выданное выражением yield.
Generator.prototype.return()
Действует так, как будто оператор return вставлен в тело генератора в текущей приостановленной позиции, что завершает генератор и позволяет ему выполнить любые задачи очистки при совместном использовании с блоком try...finally.
Generator.prototype.throw()
Действует так, как будто оператор throw вставлен в тело генератора в текущей приостановленной позиции, что информирует генератор о возникновении ошибки и позволяет ему обработать ошибку, или выполнить очистку и закрыть себя.

Примеры

Бесконечный итератор

С функцией-генератором значения не вычисляются до тех пор, пока они не понадобятся. Следовательно, генератор позволяет нам определить потенциально бесконечную структуру данных.

function* infinite() {
  let index = 0;

  while (true) {
    yield index++;
  }
}

const generator = infinite(); // "Generator { }"

console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-generator-objects

Совместимость с браузерами

Настольные Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
Generator
39
13
26
26
10
39
26
26
10
4.0
39
10
1.0.0
1.0
4.0.0
next
39
13
26
26
10
39
26
26
10
4.0
39
10
1.0.0
1.0
4.0.0
return
50
13
38
37
10
50
38
37
10
5.0
50
10
1.0.0
1.0
6.0.0
throw
39
13
26
26
10
39
26
26
10
4.0
39
10
1.0.0
1.0
4.0.0

См. также

  • function*
  • function* expression
  • GeneratorFunction
  • Протоколы итерации

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API