yield*

Вираз yield* використовується для делегування до іншого генератора чи ітерабельного об'єкта.

Синтаксис

 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 Latest Draft (ECMA-262)
The definition of 'Yield' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
yield*Chrome Full support 39Edge Full support 12Firefox Full support 27
Notes
Full support 27
Notes
Notes Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
IE No support NoOpera Full support 26Safari Full support 10WebView Android Full support 39Chrome Android Full support 39Firefox Android Full support 27
Notes
Full support 27
Notes
Notes Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
Opera Android Full support 26Safari iOS Full support 10Samsung Internet Android Full support 4.0nodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
See implementation notes.
See implementation notes.
User must explicitly enable this feature.
User must explicitly enable this feature.

Примітки щодо Firefox

  • Починаючи з Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), розбір виразів yield було оновлено для відповідності специфікації ES2015 (bug 981599):
    • Було реалізовано обмеження на переривання рядка. Переривання рядка між "yield" та "*" є недозволеним. Наступний код викине помилку SyntaxError:
      function* foo() {
        yield
        *[];
      }

Див. також