Вираз yield*
використовується для делегування до іншого генератора
чи ітерабельного об'єкта.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
yield* [[expression]];
expression
- Вираз, який повертає ітерабельний об'єкт.
Опис
Вираз yield*
перебирає свій операнд та видає кожне значення, що він повертає.
Значенням самого виразу yield*
є значення, повернене ітератором, коли він закривається (тобто, коли done
дорівнює true
).
Приклади
Делегування до іншого генератора
У наступному коді значення, отримані від g1()
, повертаються викликами next()
так само, як значення, отримані від g2()
.
function* g1() {
yield 2;
yield 3;
yield 4;
}
function* g2() {
yield 1;
yield* g1();
yield 5;
}
var iterator = g2();
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: 4, done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
Інші ітерабельні об'єкти
Окрім об'єктів-генераторів, yield*
також може отримувати значення з інших ітерабельних об'єктів, наприкад, з масивів, рядків чи об'єктів arguments.
function* g3() {
yield* [1, 2];
yield* '34';
yield* Array.from(arguments);
}
var iterator = g3(5, 6);
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: "3", done: false}
console.log(iterator.next()); // {value: "4", done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
Значення самого виразу yield*
yield*
є виразом, а не оператором, а отже, має обчислене значення.
function* g4() {
yield* [1, 2, 3];
return 'foo';
}
var result;
function* g5() {
result = yield* g4();
}
var iterator = g5();
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true},
// g4() повернув {value: 'foo', done: true} в цій точці
console.log(result); // "foo"
Специфікації
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Yield' in that specification. |
Standard | Початкове визначення. |
ECMAScript (ECMA-262) The definition of 'Yield' in that specification. |
Living Standard |
Сумісність з веб-переглядачами
BCD tables only load in the browser
Примітки щодо Firefox
- Починаючи з Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), розбір виразів yield було оновлено для відповідності специфікації ES2015 (bug 981599):
- Було реалізовано обмеження на переривання рядка. Переривання рядка між "yield" та "*" є недозволеним. Наступний код викине помилку
SyntaxError
:function* foo() { yield *[]; }
- Було реалізовано обмеження на переривання рядка. Переривання рядка між "yield" та "*" є недозволеним. Наступний код викине помилку