08循环

循环 是一种重复运行同一代码的方法。

一、“while” 循环

while 循环的语法如下:

1
2
3
4
while (condition) {
// 代码
// 所谓的“循环体”
}

当 condition 为真时,执行循环体的 code

例如,以下将循环输出当 i < 3 时的 i 值:

1
2
3
4
5
let i = 0;
while (i < 3) { // 依次显示 0、1 和 2
alert( i );
i++;
}

单行循环体不需要大括号

如果循环体只有一条语句,则可以省略大括号 {…}

1
2
let i = 3;
while (i) alert(i--);

二、“do…while” 循环

使用 do..while 语法可以将条件检查移至循环体 下面

1
2
3
do {
// 循环体
} while (condition);

循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。

例如:

1
2
3
4
5
let i = 0;
do {
alert( i );
i++;
} while (i < 3);

这种形式的语法很少使用,除非你希望不管条件是否为真,循环体 至少执行一次

三、“for” 循环

for 循环更加复杂,但它是最常使用的循环形式。

for 循环看起来就像这样:

1
2
3
for (begin; condition; step) {
// ……循环体……
}
语句段
begin let i = 0 进入循环时执行一次。
condition i < 3 在每次循环迭代之前检查,如果为 false,停止循环。
body(循环体) alert(i) 条件为真时,重复运行。
step i++ 在每次循环体迭代后执行。

除了定义一个变量,我们也可以使用现有的变量。

循环可以通过 break 指令来终止。

如果我们不想在当前迭代中做任何事,并且想要转移至下一次迭代,那么可以使用 continue 指令。

四、break/continue 标签

有时候我们需要一次从多层嵌套的循环中跳出来。

例如,下述代码中我们的循环使用了 i 和 j,从 (0,0) 到 (3,3) 提示坐标 (i, j)

1
2
3
4
5
6
7
8
9
10
11
for (let i = 0; i < 3; i++) {

for (let j = 0; j < 3; j++) {

let input = prompt(`Value at coords (${i},${j})`, '');

// 如果我想从这里退出并直接执行 alert('Done!')
}
}

alert('Done!');

我们需要提供一种方法,以在用户取消输入时来停止这个过程。

在 input 之后的普通 break 只会打破内部循环。这还不够 —— 标签可以实现这一功能!

标签 是在循环之前带有冒号的标识符:

1
2
3
labelName: for (...) {
...
}

break <labelName> 语句跳出循环至标签处:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
outer: for (let i = 0; i < 3; i++) {

for (let j = 0; j < 3; j++) {

let input = prompt(`Value at coords (${i},${j})`, '');

// 如果是空字符串或被取消,则中断并跳出这两个循环。
if (!input) break outer; // (*)

// 用得到的值做些事……
}
}

alert('Done!');

上述代码中,break outer 向上寻找名为 outer 的标签并跳出当前循环。

因此,控制权直接从 (*) 转至 alert('Done!')

我们还可以将标签移至单独一行:

1
2
outer:
for (let i = 0; i < 3; i++) { ... }

continue 指令也可以与标签一起使用。在这种情况下,执行跳转到标记循环的下一次迭代。

标签并不允许“跳到”所有位置

标签不允许我们跳到代码的任意位置。

例如,这样做是不可能的:

1
2
3
break label;  // 跳转至下面的 label 处(无效)

label: for (...)

break 指令必须在代码块内。从技术上讲,任何被标记的代码块都有效,例如:

1
2
3
4
5
label: {
// ...
break label; // 有效
// ...
}

……尽管 99.9% 的情况下 break 都被用在循环内,就像在上面那些例子中我们看到的那样。

continue 只有在循环内部才可行。

Author

WaterNorth

Posted on

2025-08-23

Updated on

2025-08-23

Licensed under