We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

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

{EmbedInteractiveExample("pages/js/expressions-yieldasterisk.html")}}

構文

 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 の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり271 なし あり10
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり271 あり10 あり

1. Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.

Firefox 固有のメモ

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

関連情報

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

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