JavaScript/yield*

カテゴリ:Book:JavaScript#yield*%20

yield* は、ECMAScript におけるジェネレーター関数内で使用される演算子です。この演算子は、別のジェネレーターや反復可能オブジェクト(例: ArrayStringMapSet など)から値を委任(delegate)するために使用されます。yield* は、反復可能オブジェクトの各値を順次 yield し、その反復が完了するまでジェネレーターの実行を一時停止します[1]

構文

yield* AssignmentExpression
  • AssignmentExpression: 反復可能オブジェクト(ジェネレーター、ArrayStringなど)を返す式。

15.5.5 Runtime Semantics: Evaluation

yield* の評価は、以下の手順で行われます:

  1. 式の評価: AssignmentExpression を評価し、反復可能オブジェクトを取得します。
  2. 反復処理: 反復可能オブジェクトのイテレータを取得し、各値を順次 yield します。
  3. 完了処理: 反復が完了したら、ジェネレーターの実行を再開します。

基本的な使用法

以下のプログラムは、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
}

このプログラムでは、generator2generator1 の値を委任し、その後 4yield します。

配列での使用

以下のプログラムは、配列に対して 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* の結果として返されます。

脚註

  1. yield* は、ジェネレーターの委任を簡単にするために使用されます。

外部リンク

カテゴリ:Book:JavaScript#yield*%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension