JavaScript/yield*
表示
yield* は、ECMAScript におけるジェネレーター関数内で使用される演算子です。この演算子は、別のジェネレーターや反復可能オブジェクト(例: Array、String、Map、Set など)から値を委任(delegate)するために使用されます。yield* は、反復可能オブジェクトの各値を順次 yield し、その反復が完了するまでジェネレーターの実行を一時停止します[1]。
構文
[編集]yield* AssignmentExpression
15.5.5 Runtime Semantics: Evaluation
[編集]yield* の評価は、以下の手順で行われます:
- 式の評価:
AssignmentExpressionを評価し、反復可能オブジェクトを取得します。 - 反復処理: 反復可能オブジェクトのイテレータを取得し、各値を順次
yieldします。 - 完了処理: 反復が完了したら、ジェネレーターの実行を再開します。
例
[編集]基本的な使用法
[編集]以下のプログラムは、yield* の基本的な使用法を示しています。
// 基本的な使用法 function* generator1() { yield 1; yield 2; yield 3; } function* generator2() { yield* generator1(); // generator1 の値を委任 yield 4; } for (const value of generator2()) { console.log(value); // 1, 2, 3, 4 }
このプログラムでは、generator2 が generator1 の値を委任し、その後 4 を yield します。
配列での使用
[編集]以下のプログラムは、配列に対して yield* を使用する例を示しています。
// 配列での使用 function* generator() { yield* [1, 2, 3]; yield 4; } for (const value of generator()) { console.log(value); // 1, 2, 3, 4 }
このプログラムでは、配列 [1, 2, 3] の各値が yield され、その後 4 が yield されます。
文字列での使用
[編集]以下のプログラムは、文字列に対して yield* を使用する例を示しています。
// 文字列での使用 function* generator() { yield* "Hello"; } for (const value of generator()) { console.log(value); // "H", "e", "l", "l", "o" }
このプログラムでは、文字列 "Hello" の各文字が yield されます。
注意点
[編集]- 反復可能オブジェクト:
yield*は、反復可能オブジェクト(Symbol.iteratorメソッドを持つオブジェクト)でのみ使用できます。 - ジェネレーターの委任:
yield*を使用することで、ジェネレーターの値を別のジェネレーターに委任できます。 - 完了値:
yield*は、反復可能オブジェクトの完了値を返します。例えば、ジェネレーターがreturnで値を返す場合、その値がyield*の結果として返されます。