Генератор
Базовый уровень Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с сентября 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
// …
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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