yield*は別の ジェネレーター や反復可能なオブジェクトに委任するために使用されます。

構文

 yield* [[expression]];
expression
反復可能なオブジェクトを返す式。

Description

yield* 式はオペランドを反復し、それによって返されたそれぞれの値をもたらします。

yield* 式自体の値は、イテレーターが閉じたとき(つまり donetrue のとき)に返される値です。

別のジェネレータに委任する

次のコードでは、 g1() によってもたらされる値は、g2() で得られているものとちょうど同じように next() の呼び出しから返されます。

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* は反復の他の種類、例えば、配列、文字列、引数オブジェクトを yield できます。

function* g3() {
  yield* [1, 2];
  yield* "34";
  yield* 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() returned { value: "foo", done: true } at this point

console.log(result);          // "foo"

仕様

仕様 ステータス コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Yield の定義
標準 初期定義。
ECMAScript Latest Draft (ECMA-262)
Yield の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
基本対応Chrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 27
補足
完全対応 27
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
IE 未対応 なしOpera 完全対応 ありSafari 完全対応 10WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 27
補足
完全対応 27
補足
補足 Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.
Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 ありnodejs 完全対応 4.0.0
完全対応 4.0.0
完全対応 0.12
無効
無効 From version 0.12: this feature is behind the --harmony runtime flag.

凡例

完全対応  
完全対応
未対応  
未対応
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

Firefox 固有のメモ

  • Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30) から、yield 式のパースは最新の ES2015 仕様に適合するように更新されました。(バグ 981599):
    • ラインターミネーターの制限が実装されました。"yield" と "*" との間のラインターミネーターは許されません。次のようなコードは SyntaxError をスローします。:
      function* foo() {
        yield
        *[];
      }

関連情報

ドキュメントのタグと貢献者

このページの貢献者: toVersus, dlwe, Uemmra3, YuichiNukiyama, isdh, shide55
最終更新者: toVersus,