yield*

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

構文

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

説明

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

yield* 式自体の値は、閉じたときに反復子によって返される値です(例 done が true のとき)。

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

次のコードでは、 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 2017 Draft (ECMA-262)
Yield の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート (有) 27.0 (27.0) ? ? ?
機能 Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) 27.0 (27.0) ? ? ?

Firefox 固有のメモ

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

関連情報

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

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