function*
Функция-генератор: выдаёт значения по одному через yield.
Доступно с: ES2015
Синтаксис
function* name() { yield value; }Примеры
Генератор выдаёт значения по требованию:
function* count() {
yield 1;
yield 2;
yield 3;
}
console.log([...count()].join(', '));Результат:
1, 2, 3Бесконечная последовательность — берём только нужное:
function* ids() {
let id = 1;
while (true) yield id++;
}
const generator = ids();
console.log(generator.next().value);
console.log(generator.next().value);
console.log(generator.next().value);Результат:
1
2
3Методы итераторов:
function* naturals() {
let n = 1;
while (true) yield n++;
}
console.log(naturals().filter((n) => n % 2 === 0).map((n) => n * 10).take(3).toArray().join(', '));Результат:
20, 40, 60Примечания
Код генератора выполняется по частям: каждый вызов next() доходит до следующего yield и останавливается. Поэтому бесконечный цикл внутри генератора не зависает программу.
См. также
- Symbol.iterator — Особый ключ, который делает объект перебираемым в for...of и spread.
- for...of — Перебирает значения массива, строки, Map, Set и других перебираемых объектов.
- for await...of — Перебирает асинхронные источники данных, дожидаясь каждого элемента.
В учебнике
- Итераторы и генераторы — Как работает for...of в JavaScript: перебираемые объекты, итераторы и метод next, функции-генераторы с yield и свой перебираемый объект.