HTML Living Standard  第3部 Javascript 5 反復処理


 

5 反復処理

様々な種類の反復処理がありますが、それらは処理を数回繰り返します(そして、その回数をゼロとすることは実際可能です)。様々な反復処理は、反復の開始点と終了点を決定するためのさまざまな方法を提供しています。

5.1  for 文

最初に 式1 を実行し、次に、文 と 式3 を 式2 が真である間繰り返します。

for 文は、一般的にあらかじめ繰り返す回数や範囲がわかっている場合に使います。

for 命令

最初に 式1 を実行し、次に、文 と 式3 を 式2 が真である間繰り返す。

for (式1; 式2; 式3) {
  文;
}
記述例
  <div id="sum"></div>

  <script>
    let sum = 0;
    for (let i = 0; i < 10; i++) {
      sum += i;
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例

5.2  for...in 文

オブジェクトにあるすべての列挙可能なプロパティに対し指定された制御変数を通して反復処理を行います。

制御変数には、プロパティ名が順に設定されます。例えば、配列の場合は値の存在する要素の番号(ただし、文字列型)であり、オブジェクトの場合はプロパティの名称です。

for...in 命令

オブジェクトにあるすべての列挙可能なプロパティに対し指定された制御変数を通して繰り返す。

for (制御変数 in オブジェクト) {
  文;
}
記述例
  <div id="sum"></div>

  <script>
    let sum = 0;
    let a = [1, 2, 3, , 5];
    for (let i in a) {    // i には順に 0、1、2、4 が設定される
      sum += a[i];
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例
記述例
  <div id="sum"></div>

  <script>
    let sum = 0;
    let a = {a:1, b:2, c:3, e:5};
    for (let i in a) {    // i には順に "a"、"b"、"c"、"e" が設定される
      sum += a[i];
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例

5.3  for...of 文

配列などの反復可能なオブジェクトから取得した値ごとに反復処理を行います。

for...of 命令

配列などの反復可能なオブジェクトから取得した値ごとに繰り返す。

for (変数 of オブジェクト) {
  文;
}
記述例
  <div id="sum"></div>

  <script>
    let sum = 0;
    let a = [1, 2, 3, 5];
    for (let n of a) {    // n には順に 1、2、3、5 が設定される
      sum += n;
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例
記述例
  <div id="sum"></div>

  <script>
    let sum = 0;
    let a = new Map([["a", 1], ["b", 2], ["c", 3], ["e", 5]]);
    for (let [key, value] of a) {    // value には順に 1、2、3、5 が設定される
      sum += value;
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例

5.4  do...while 文

指定された条件が false になるまで繰り返します。ただし、条件が満たされなくても1度は処理が実行されます。

do...while 文は、繰り返す回数や範囲がわかっていない場合に有効です。

do...while 命令

指定された条件が false になるまで繰り返す。ただし、条件が満たされなくても1度は処理が実行される。

do {
  文;
} while(条件);
記述例
  <div id="sum"></div>

  <script>
    let i = 0, sum = 0;
    do {
      sum += ++i;
    } while (sum < 100);
    document.getElementById("sum").textContent=sum;
  </script>
実行例

5.5  while 文

指定された条件が false になるまで繰り返します。ただし、条件が満たされないと1度も処理は実行されません。

while 文は、繰り返す回数や範囲がわかっていない場合に有効です。

while 命令

指定された条件が false になるまで繰り返す。ただし、条件が満たされないと1度も処理は実行されない。

while(条件) {
  文;
}
記述例
  <div id="sum"></div>

  <script>
    let i = 0, sum = 0;
    while (sum < 100) {
      sum += ++i;
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例

5.6  break 文

for、while、do-while、switch 文を終了させるには break 文を使います。

break 命令

for、while、do-while、switch 文を終了させる。

break [ラベル];        // ラベルは省略可

最も内側の for、while、do-while、switch 文から抜け出し次の文に制御を移すには、ラベルなしで break 文を使用します。

記述例
  <div id="sum"></div>

  <script>
    let i = 0, sum = 0;
    while (i < 100) {
      sum += ++i;
      if (sum > 1000) {
        break;  // 繰り返しブロックから抜け出す
      }
    }
    // ここに抜け出す
    document.getElementById("sum").textContent=sum;
  </script>
実行例

ラベル付きブロックから抜け出すには、break に続いて抜け出したいブロックのラベルを記述します。ラベル付きブロックは必ずしもループ文である必要はありません。

    let sum = 0;
loop:
    for (let i = 0 ; i < 5 ; i++) {
      for (let j = 0 ; j < 10 ; j++) {
        if (a[i][j] == 0) {
          break loop;  // loop というラベルが付いたブロックから抜け出す
        }
        sum += a[i][j];
      }
    }
    // ここに抜け出す

5.7  continue 文

for、while、do-while 文で現在の繰り返しを終了し、次の繰り返しの実行を継続するには continue 文を使います。

continue 命令

for、while、do-while、switch 文で現在の繰り返しを終了し、次の繰り返しの実行を継続させる。

continue [ラベル];        // ラベルは省略可

最も内側の for、while、do-while 文で現在の繰り返しを終了し、次の繰り返しの実行を継続するには、ラベルなしで continue 文を使用します。

記述例
  <div id="sum"></div>

  <script>
    let i = -1, sum = 0;
    let a = [1, 0, 3, 4, -5, 6, 7, -1, 0, 10];
    while (++i < 10) {
      if (a[i] <= 0) {
        continue;  // 次の繰り返しになる
      }
      sum += a[i];
      // ここから繰り返しを継続する
    }
    document.getElementById("sum").textContent=sum;
  </script>
実行例

ラベル付きの繰り返しブロックの次の繰り返しに移るには、continue に続いて継続したいブロックのラベルを記述します。

  let sum = 0;
loop:
  for (let i = 0 ; i < 5 ; i++) {
    for (let j = 0 ; j < 10 ; j++) {
      if (a[i][j] == 0) {
        continue loop;  // loop というラベルが付いたブロックの次の繰り返しになる
      }
      sum += a[i][j];
    }
    // ここから繰り返しを継続する
  }