配列を繰り返す — for / for...of / forEach

配列の要素を1つずつ処理する3つの書き方を、違いが分かる形で比べます。途中で抜けられるか、添字が使えるか、非同期で待てるか。選ぶ基準まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES6難易度●●○○○目安10更新

前回は、配列を作って添字で取り出しました。 今回は全部の要素を順番に処理する方法です。

結論から言うと、ふだんは for...of を使ってください。 理由はこのあと説明します。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
りんご みかん ぶどう
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
for : りんご for : みかん for : ぶどう for...of : りんご for...of : みかん for...of : ぶどう forEach : りんご forEach : みかん forEach : ぶどう

上のコードは書き換えて実行できます。fruits に要素を足してみてください。

3つの書き方

同じことを3通りで書きます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
見ている: 1 見ている: 5 見ている: 8 見つけた: 12
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1 3 5

出力は同じです。違うのは書き心地と、できることです。

添字が使えるか 途中で抜けられるか await で待てるか
for 使える 抜けられる 待てる
for...of 別に用意すれば使える 抜けられる 待てる
forEach() 使える(第2引数) 抜けられない 待てない

途中で抜ける

条件に合ったところで止めたいことがあります。break を使います。

javascript
const nums = [1, 5, 8, 12, 3];

nums.forEach((n) => {
if (n > 10) return;
console.log(n);
});
1 5 8 3
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
0 りんご 1 みかん 2 ぶどう

12 を見つけたところで止まったので、最後の 3 は見ていません。

その回だけ飛ばしたいときは continue です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
0 りんご 1 みかん 2 ぶどう
javascript
const ids = [1, 2, 3];

const load = async (id) => `データ${id}`;

ids.forEach(async (id) => {
const data = await load(id);
console.log(data);
});

console.log('ここが先に出てしまう');
ここが先に出てしまう データ1 データ2 データ3

forEach は途中で抜けられない

ここが forEach() のいちばん大きな制限です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
データ1 データ2 データ3 全部終わってから出る
javascript
const fruits = ['りんご', 'みかん'];

for (const i of fruits.keys()) {
console.log(typeof i, i);
}

for (const i in fruits) {
console.log(typeof i, i);
}
number 0 number 1 string 0 string 1

returnそのコールバック関数から抜けるだけで、繰り返し自体は止まりません。 12 は飛ばされましたが、そのあとの 3出てしまいました

forEach() の中に break は書けません。書くと構文エラーになります。

途中で抜けたいなら for...of を使ってください。

添字も欲しいとき

for...of だけでは添字が取れません。entries() を使うと添字と値の両方が取れます。

forEach() は第2引数で受け取れます。

待つ処理では forEach を使わない

時間のかかる処理を順番に待ちながら回したいとき、forEach() では待てません。

forEach()コールバック関数の中の await を待ちません。 先へ進んでしまい、順序が崩れます。

for...of なら待てます。

このページの実行環境では、コードの一番外側でも await が書けます。

for...in を配列に使わない

名前が似ていますが、for...inオブジェクトのキーを回すものです。 配列に使うと、添字が文字列で来ます。

'0' + 1'01' になるので、計算に使うと静かに壊れます配列には for...of を使ってください。

まとめ

  • ふだんは for...of。読みやすく、breakawait も使える
  • 添字が要るときは entries() を足す
  • forEach()途中で抜けられずawait も待てない
  • for...in配列向けではない

次に学ぶ

繰り返しながら新しい配列を作る書き方を学びます。 map()filter() を使うと、ここまで書いてきたループの多くが1行になります。

第3回: 配列を変換する・絞り込む

この記事の根拠

  1. The for Statement — ECMAScript® 2026 Language Specificationtc39.es
  2. The for-in and for-of Statements — ECMAScript® 2026 Language Specificationtc39.es
  3. Array.prototype.forEach — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)