JavaScriptのfor...ofループとジェネレーターの組み合わせについて


まず、for...ofループの基本的な構文を確認しましょう。

for (const element of iterable) {
  // ループの本体
}

ここで、iterableは繰り返し処理を行いたいオブジェクトであり、elementは各反復で取得される要素です。

ジェネレーターは、関数内でyield文を使用して値を生成する特殊な関数です。ジェネレーター関数はfunction*キーワードで定義されます。以下はジェネレーター関数の例です。

function* generatorFunction() {
  yield 1;
  yield 2;
  yield 3;
}

このジェネレーター関数は、1から3までの値を生成します。

これらの概念を組み合わせると、次のようなコードが作成できます。

function* generatorFunction() {
  yield 'apple';
  yield 'banana';
  yield 'cherry';
}
const generator = generatorFunction();
for (const fruit of generator) {
  console.log(fruit);
}

この例では、generatorFunctionというジェネレーター関数を定義し、その生成物をfor...ofループで処理しています。各反復でジェネレーターから値が取得され、コンソールに表示されます。

さらに、for...ofループとジェネレーターを組み合わせることで、無限の値を生成することも可能です。例えば、以下のコードではフィボナッチ数列のジェネレーターを作成しています。

function* fibonacciGenerator() {
  let current = 0;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}
const fibonacci = fibonacciGenerator();
for (const number of fibonacci) {
  if (number > 1000) {
    break;
  }
  console.log(number);
}

この例では、フィボナッチ数列のジェネレーターを作成し、for...ofループで処理しています。ジェネレーターは無限に値を生成するため、numberが1000を超えた時点でループを終了します。

以上が、JavaScriptのfor...ofループとジェネレーターの組み合わせについての解説です。これらの機能を活用することで、柔軟な繰り返し処理や無限の値の生成が可能となります。