JavaScript

The JavaScript for...of loop is a method for quickly processing each item in an array one by one.

for...of [loop]

 JavaScriptのfor...ofループは、配列やコレクションを通して繰り返し処理を行う際に使用される構文です。このループを利用することで、配列の各要素に対して順番にアクセスし、特定の操作を実行することが可能になります。

 例えば、ある配列に含まれるすべての数字に対して同じ処理を行いたい場合、for...ofループを使用することで、配列の最初の要素から最後の要素まで、一つ一つ順に処理を適用していくことができます。これにより、コードを簡潔に保ちながら効率的に配列の各要素を扱うことが可能になります。

 for...ofループの基本的な構文は次のようになります。

JavaScript

for (const element of array) {
	// ここで各elementに対する操作を行う
}

 ここで array は処理を行いたい配列を表し、element は配列の各要素がループの各ステップでどのように参照されるかを示します。ループが実行されるたびに、element は配列の次の要素に自動的に更新され、配列の全ての要素が処理されるまでこの過程が繰り返されます。

 例えば、以下のような配列があるとします。

JavaScript

const numbers = [1, 2, 3, 4, 5];

 この配列を for...ofループで処理すると、以下のようになります。

JavaScript

for (const number of numbers) {
	console.log(number);
}

 このループでは、配列 numbers の要素を順番に取り出し、それぞれの値を変数 number に代入しています。そして、console.log()関数を使用して、変数 number の値を出力しています。

 このコードの実行結果は下図のようになります。

for...ofループの実行画像

 このループを用いることで、コードの読みやすさとメンテナンスの容易さを向上させることができます。for...ofループは、配列だけでなく、文字列やMap、Setといった他のイテラブルなオブジェクトに対しても使用することができ、JavaScriptにおける繰り返し処理をより柔軟に行う手段を提供します。

 また、for...ofループは、forループよりもシンプルで読みやすく、コードを簡潔にすることができるというメリットがあります。しかし、forループと比べて、反復処理のインデックスを取得することができないというデメリットもあります。

forループでは、配列のインデックスを取得して、配列の値にアクセスすることができます。例えば、以下のような forループがあります。

JavaScript

const numbers = [1, 2, 3, 4, 5];

for (let i = 0; i < numbers.length; i++) {
	console.log(numbers[i]);
}

 このループでは、配列 numbers のインデックスを 0 から始め、numbers.length未満まで繰り返します。そして、配列の各要素にアクセスするために、numbers[i]のようにインデックスを使用しています。

 このコードの実行結果は下図のようになります。

forループの実行画像

 for...ofループでは、インデックスにアクセスできないため、配列のインデックスを使用する必要がなく、コードが簡潔になるというメリットがあります。しかし、インデックスにアクセスする必要がある場合は、forループを使用する必要があります。

 また、for...ofループでは、配列の要素を変更することができないという制限があります。例えば、以下のようなコードを考えてみましょう。

JavaScript

const numbers = [1, 2, 3, 4, 5];

for (let number of numbers) {
	if (number === 3) {
		number = 6;
	}
	console.log(number);
}
console.log(numbers);

 このコードでは、配列の要素を変更するために、変数 number に 6 を代入しています。しかし、このコードを実行すると、配列 numbers の要素は変更されません。これは、for...ofループが、反復処理対象のオブジェクトを読み取り専用として扱うためです。

for...ofループの実行画像

 このように、for...ofループにはメリットとデメリットがあります。配列や文字列などの反復可能オブジェクトを処理する場合は、for...ofループを使用することで、よりシンプルなコードを記述することができます。しかし、インデックスにアクセスする必要がある場合や、反復処理対象のオブジェクトを変更する必要がある場合は、forループを使用する必要があります。

 for...ofループは、配列だけでなく、文字列や Map、Setなど、反復可能オブジェクトを処理するために使用することができます。

 以下に、文字列を反復処理する for...ofループの例を示します。

JavaScript

const str = "hello";

for (const char of str) {
	console.log(char);
}

 このループでは、文字列 "hello" の各文字にアクセスするために、char という変数を使用しています。ループの実行結果は以下のようになります。

for...ofループの実行画像

 また、Mapや Setなどの反復可能オブジェクトを処理するためにも、for...ofループを使用することができます。以下に、Mapを反復処理する for...ofループの例を示します。

JavaScript

const myMap = new Map([
	["key1", "value1"],
	["key2", "value2"],
	["key3", "value3"]
]);

for (const [key, value] of myMap) {
	console.log(`${key} -> ${value}`);
}

 このループでは、Mapの各キーと値にアクセスするために、配列の分割代入を使用しています。ループの実行結果は以下のようになります。

for...ofループの実行画像

 for...ofループは、反復処理対象のオブジェクトによって処理方法が異なるため、慣れるまでは使い方に注意が必要です。また、for...ofループによる処理が forループよりも遅い場合があるため、大量のデータを処理する場合には、forループを使用した方が効率的です。

 また、for...ofループは、配列や文字列を操作する場合には、配列メソッドや文字列メソッドを使用することができる場合があります。例えば、配列の mapメソッドを使用して、for...ofループを使わずに配列の各要素を変換することができます。

 以下は、配列の mapメソッドを使用して、配列の各要素を 2倍に変換する例です。

JavaScript

const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(num => num * 2);

console.log(doubledNumbers); // [2, 4, 6, 8, 10]
mapメソッドの実行画像

 また、for...ofループには、break文や continue文を使用することができます。break文は、ループを途中で中断するために使用されます。以下は、配列の各要素を処理し、5以上の値が出たらループを中断する例です。

JavaScript

const numbers = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10];

for (const num of numbers) {
	console.log(num);
	
	if (num >= 5) {
		break;
	}
}

 このループでは、5以上の値が出た時点でループが中断されます。ループの実行結果は下図のようになります。

for...ofループの実行画像

 continue文は、ループの次の反復処理に進むために使用されます。以下は、配列の各要素を処理し、偶数の値だけを出力する例です。

JavaScript

const numbers = [1, 2, 3, 4, 5];

for (const num of numbers) {
	if (num % 2 !== 0) {
		continue;
	}
	
	console.log(num);
}

 このループでは、奇数の値が出た場合には、console.logをスキップして、次の反復処理に進みます。ループの実行結果は下図のようになります。

for...ofループの実行画像