JavaScript 入門 | 制御文 (control flow statements) | 繰り返し文 (iteration statements)

繰り返し文 (iteration statements)

繰り返し文とは、プログラム内で同じ命令を一定回数だけ繰り返して実行するよう制御する文である。 プログラムが処理するコードの多くは反復的な形であるため、最もよく使用される文の 1 つである。

JavaScript で使用できる繰り返し文の形式は次のとおりである。

  1. while 文
  2. do / while 文
  3. for 文
  4. for / in 文
  5. for / of 文

while 文

while 文は、特定の条件を満たすまで、与えられた文を繰り返し実行する。

while 文の構文は次のとおりである。

while () {
    式の結果が true の間繰り返し実行したい文;
}

while 文はまず式が true かどうかを判定し、true であれば内部の文を実行する。
内部の文をすべて実行すると、再び式に戻り、もう一度式が true かどうかを判定する。
このように式の検査によって繰り返し実行される繰り返し文をループ (loop) という。

var i = 1;
while (i < 10) { // 変数 i が 10 より小さい間だけ while 文を繰り返す。
    document.write(i + "<br>");
    i++; // 繰り返すたびに変数 i を 1 ずつ増やし、i が 10 より大きくなると繰り返しを終了する。
}

while 文の内部に式の結果を変更する文が存在しない場合、プログラムはループを永遠に繰り返す。 これを無限ループ (infinite loop) に陥ったという。無限ループに陥ったプログラムは永遠に終了しない。 無限ループは、特別に意図した場合でなければ必ず避けるべき状況である。

したがって while 文を書くときは、式の結果がいつか false になるように式を変更する文を必ず含める必要がある。

while 文で実行される文が 1 行だけであれば、中括弧 ({}) を省略できる。

do / while 文

while 文はループに入る前にまず式を検査する。
しかし do / while 文は、まずループを 1 回実行した後に式を検査する。
つまり do / while 文は、式の結果に関係なく必ず 1 回はループを実行する。

do / while 文の構文は次のとおりである。

do {
    式の結果が true の間繰り返し実行したい文;
} while ();
var i = 1, j = 1;
while (i > 3) { // 変数 i の初期値は 1 なので、この while 文は一度も実行されない。
    document.write("i : " + (i++) + "<br>");
}
do { // 変数 j の初期値は 1 なので、この do / while 文は一度だけ実行される。
    document.write("j : " + (j++) + "<br>");
} while (j > 3);

for 文

for 文は while 文とは異なり、初期式、式、増減式をすべて自分自身に含む繰り返し文である。
したがって while 文よりも簡潔に繰り返しを表現できる。

for 文の構文は次のとおりである。

for (初期式; ; 増減式) {
    式の結果が true の間繰り返し実行したい文;
}

for 文を構成する初期式、式、増減式はそれぞれ省略できる。
また、カンマ演算子 (,) を使用すると、複数の初期式や増減式を同時に使用することもできる。

for 文を使用すると、先ほどの while 文の例をさらに簡潔に表現できる。

for (var i = 1; i < 10; i++) {
    document.write(i + "<br>");
}

for 文で実行される文が 1 行だけであれば、中括弧 ({}) を省略できる。

for / in 文

for / in 文は、一般的な for 文とはまったく異なる形式の繰り返し文である。 for / in 文は、そのオブジェクトのすべての列挙可能なプロパティ (enumerable properties) を巡回できるようにする。

列挙可能なプロパティとは、内部的に enumerable フラグが true に設定されたプロパティを意味する。
このようなプロパティは for / in 文でアクセスできる。

この繰り返し文は、ループごとにオブジェクトの列挙可能なプロパティ名を指定された変数へ代入する。 代入された変数を利用すると、ループ内でオブジェクトの列挙可能なプロパティへ順番にアクセスできる。

for / in 文の構文は次のとおりである。

for (変数 in オブジェクト) {
    オブジェクトのすべての列挙可能なプロパティの数だけ繰り返し実行したい文;
}

次の例は、for / in 文を使用して配列の要素にアクセスする例である。

var arr = [3, 4, 5];
for (var i = 0; i < arr.length; i++) { // 配列 arr のすべての要素のインデックスを出力する。
    document.write(i + " ");
}
for (var i in arr) { // 上と同じ動作をする for / in 文
    document.write(i + " ");
}

次の例は、for / in 文を使用してオブジェクトのプロパティにアクセスする例である。

var obj = { name : "山田太郎", age : 20 };
for (var i in obj) {
    document.write(i + "<br>");
}

for / in 文は、そのオブジェクトが持つすべてのプロパティではなく、列挙可能なプロパティだけを返す。

for / of 文

for / of 文は、反復可能オブジェクト (iterable objects) を巡回できるようにする繰り返し文である。

JavaScript で反復可能なオブジェクトには、Array、Map、Set、arguments オブジェクトなどがある。 この繰り返し文は、ループごとにオブジェクトの列挙可能なプロパティの値を指定された変数へ代入する。

for / of 文の構文は次のとおりである。

構文

for (変数 of オブジェクト) {
    オブジェクトのすべての列挙可能なプロパティの数だけ繰り返し実行したい文;
}

次の例は、for / of 文を使用して配列の要素にアクセスする例である。

var arr = [3, 4, 5];
for (var i = 0; i < arr.length; i++) { // 配列 arr のすべての要素を出力する。
    document.write(arr[i] + " ");
}
for (var value of arr) { // 上と同じ動作をする for / of 文
    document.write(value + " ");
}

for / of 文は Internet Explorer ではサポートされない。

次の例は、for / of 文を使用して Set オブジェクトのプロパティにアクセスする例である。

var arr = new Set([1, 1, 2, 2, 3, 3]);
for (var value of arr) {
    document.write(value + " ");
}