プログラムにおける反復(イテレーション)とは、特定の条件が満たされるまで、あるいはデータ集合の全要素に対して、一連の命令を逐次実行する制御構造を指す。
繰り返し処理
for…of 文(反復可能オブジェクトの走査 実体参照型)
反復可能オブジェクト(Iterable objects)から値を順次取り出し、ループ変数に代入して処理を行う構造。配列と添字をベースとせず、ドット記法でプロパティに即アクセス可能
- 定義:配列(Array)、文字列(String)、Map、Setなどの反復プロトコルを実装したオブジェクトに適用
- 特性:
async/awaitによる非同期処理の逐次実行(直列処理)を完全にサポート - 用途:配列要素の参照および、要素が保持するプロパティへのアクセス
- アクセス形式:item.property
Array.prototype.forEach()(配列専用の反復メソッド コールバック委託型)
配列インスタンスに備わった高階関数による反復処理
- 定義:引数として与えられたコールバック関数を、配列の各要素に対して一度ずつ実行
- 特性:命令的ではなく宣言的な記述を可能にするが、反復の途中で中断(
break)することは不可能 - 用途:配列全要素に対する一律の副作用の適用
- アクセス形式:(item) => item.p
for…in 文(列挙可能プロパティの探索 プロパティ走査型)
オブジェクトの継承されたプロパティを含め、列挙可能なプロパティ名(キー)に対しての反復
- 定義:オブジェクトの各プロパティ名(String型またはSymbol型)を抽出
- 特性:プロパティの列挙順序は保証されない。配列に対して使用した場合、インデックスが文字列として返却されるため非推奨
- 用途:オブジェクト内部の状態検査、または連想配列の走査
- アクセス形式:obj[key]
for 文(初期値・条件式・増分による計数反復 索引経由型)
ループカウンタを用いた、最も基本的かつ汎用的な制御構造
- 定義:
for (初期化式; 条件式; 増分式)の形式をとり、条件式が偽(false)になるまで処理を継続 - 特性:インデックスを任意に操作(増減の歩進、逆順走査等)できる高い制御能力を有する
- 用途:複雑な添字操作を伴うアルゴリズムの構築
- アクセス形式:arr[i].property
while / do…while 文(条件依存の反復 条件継続型)
指定された論理式の評価結果が真(true)である間、処理を繰り返す構造
- 定義:前判定(
while)または後判定(do...while)により、反復の継続を決定 - 特性:反復回数が事前に定まっていない動的な処理に適する
- 用途:状態監視、入力待機、リトライ処理
- アクセス形式:変数
配列(Array)とオブジェクト(Object)
| 配列 | オブジェクト | |
|---|---|---|
| 要素 | 要素(Element) | プロパティ、属性(Property) |
| 識別 | 添字(Index)[0, 1, 2…] | キー(Key){id, name, slug…} |
| アクセス | array[0](物理的指定) | object.name(論理的指定) |
| 記述 | [] | {} |
// for...of 文
const players = [ { slug: "ohtani", hr: 54 }, { slug: "judge", hr: 58 } ];
for (const player of players) {
// 🔸実体(player)にドット記法で即アクセス
console.log(player.slug + ": " + player.hr);
}
// forEach 文
const players = [ { slug: "ohtani", hr: 54 }, { slug: "judge", hr: 58 } ];
players.forEach((player) => {
// 🔸コールバック関数の引数として実体を受け取る
console.log(player.slug);
});
// for...in 文
const stats = { slug: "ohtani", team: "LAD", hr: 54 };
for (const key in stats) {
// 🔸取り出されるのは「キー(名前)」であり、値へは再アクセスが必要
console.log(key + ": " + stats[key]);
}
// for 文
const players = [ { slug: "ohtani" }, { slug: "judge" } ];
for (let i = 0; i < players.length; i++) {
// 🔸索引(i)という物理的な位置を経由して実体に到達する
console.log(players[i].slug);
}
// while / do...while 文
let i = 0; // 🔸外部変数(カウンタ)
const players = [ { slug: "ohtani" }, { slug: "judge" } ];
while (i < players.length) {
// 🔸外部変数の状態に依存して処理を継続
console.log(players[i].slug);
i++;
}