まず、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ループとジェネレーターの組み合わせについての解説です。これらの機能を活用することで、柔軟な繰り返し処理や無限の値の生成が可能となります。