【JavaScript】繰り返し処理:while文

while文
ある条件が成り立っている間だけ、処理を繰り返し実行する制御文です。
for文との違いは、カウンタにあたるものがないことです。
主に繰り返す回数が分からないときに使います。


do〜while文
while文と同じように繰り返しを行う制御文です。
while文では条件が先にあるので、最初の回で条件が成立しなければ処理を1度も実行しません。
しかし、do〜while文では条件を下に書くため、必ず1度は処理を実行します。


無限ループ
while文など繰り返し処理を行う制御文では、常に成立するような条件を指定してしまうと処理を永久に繰り返してしまいます。
これを無限ループといい、バグの原因になります。
無限ループにならないように条件と処理の内容に注意します。


<例題>
1から10までの和を求めます。

<script type="text/javascript">
	//do〜while文:do{ 処理 } while(条件); 処理

	//初期設定:変数a、変数b
	a = b = 0;
	
	//変数aは和の合計
	//変数bは1〜10までの整数
	/*計算方法
	 * a = 0 + 1
	 * a = 1 + 2
	 * a = 3 + 3
	 * a = 6 + 4
	 ・・・
	 * a = 45 + 10
	*/

	do {
	++b;
	a = a + b; //a += bという書き方でも正しい
	} while (b < 10);
		
	//結果の表示
	document.write("1から" + b + "までの和は" + a + "です");

	/*実行結果
	 *1から10の和は55です
	 */
</script>


break文
for文やwhile文などの繰り返しを中断するにはbreak文を使います。
プログラムを中断すると、一番近いブロックの終りにジャンプします。

<script type="text/javascript">
	b = 1;
	for (a = 0; a < 5; a++){
	if(a + b == 4) 	//条件(a + b = 4)と一致したら処理を中断
	break; //一番近いブロックの終りにジャンプ
	document.write(a + "+" + b +"=" + (a+b) + "<br>");
} //←breakが実行された時、ここにジャンプします。

/*
実行結果
0+1=1
1+1=2
2+1=3
*/
</script>


continue文
繰り返しのその回の処理をスキップし、次の回の最初から実行します。

<script type="text/javascript">
	b = 1;
	for (a = 0; a < 5; a++) {
	if (a + b == 4) //条件(a + b = 4)と一致したら処理をスキップ
	continue; //for文に戻ります。 ※このとき、document.writeは実行されません
	document.write(a + "+" + b + "=" + (a + b) + "<br>");
}

/*
実行結果
0+1=1
1+1=2
2+1=3
4+1=5
*/
</script>


<補足>
break、continueのラベル指定
for文やwhile文の中でbreakやcontinueを使うと一番内側のループ処理を中断/スキップすることができます。
breakやcontinueにラベル指定をすることでラベルのあるループを中断/スキップすることができます。
それではラベルの有る無しでプログラムの挙動にどのような違いがあるのか結果を比べてみます。

<script type="text/javascript">
// ラベル指定無しの場合
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 3; j++) {
		if (i + j == 1) 
		break;
		document.write(i + "+" + j + "=" + (i + j) + "<br />");
		} //←breakが実行された時、ここにジャンプします。最初のfor文に戻ります。
	}
	
/*実行結果
0+0=0
2+0=2
2+1=3
2+2=4
*/

</script>
<br />
<script type="text/javascript">
// ラベル指定有りの場合
		label1: //ラベル名:(セミコロン)
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 3; j++) {
			if (i + j == 1) 
			break label1; //ラベル名を挿入
			document.write(i + "+" + j + "=" + (i + j) + "<br />");
			}
		} //←breakが実行された時、ここにジャンプします。
	
/*実行結果
0+0=0
*/

</script>