循环和for
我们经常需要重复执行一些操作。
例如,我们需要将列表中的商品逐个输出,或者运行相同的代码将数字 1 到 10 逐个输出。
循环 是一种重复运行同一代码的方法。
# “while” 循环
while
循环的语法如下:
while (condition) {
// 代码
// 所谓的“循环体”
}
2
3
4
当 condition
为真时,执行循环体的 code
。
例如,以下将循环输出当 i < 3
时的 i
值:
let i = 0;
while (i < 3) { // 依次显示 0、1 和 2
alert( i );
i++;
}
2
3
4
5
循环体的单次执行叫作 一次迭代。上面示例中的循环进行了三次迭代。
如果上述示例中没有 i++
,那么循环(理论上)会永远重复执行下去。实际上,浏览器提供了阻止这种循环的方法,我们可以通过终止进程,来停掉服务器端的 JavaScript。
任何表达式或变量都可以是循环条件,而不仅仅是比较。在 while
中的循环条件会被计算,计算结果会被转化为布尔值。
例如,while (i != 0)
可简写为 while (i)
:
let i = 3;
while (i) { // 当 i 变成 0 时,条件为假,循环终止
alert( i );
i--;
}
2
3
4
5
单行循环体不需要大括号
如果循环体只有一条语句,则可以省略大括号
{…}
:let i = 3; while (i) alert(i--);
1
2
# “do…while” 循环
使用 do..while
语法可以将条件检查移至循环体 下面:
do {
// 循环体
} while (condition);
2
3
循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。
例如:
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
2
3
4
5
这种形式的语法很少使用,除非你希望不管条件是否为真,循环体 至少执行一次。通常我们更倾向于使用另一个形式:while(…) {…}
。
# “for” 循环
for
循环更加复杂,但它是最常使用的循环形式。
for
循环看起来就像这样:
for (begin; condition; step) {
// ……循环体……
}
2
3
我们通过示例来了解一下这三个部分的含义。下述循环从 i
等于 0
到 3
(但不包括 3
)运行 alert(i)
:
for (let i = 0; i < 3; i++) { // 结果为 0、1、2
alert(i);
}
2
3
语句段 | ||
---|---|---|
begin | i = 0; | 进入循环时执行一次 |
condition | i < 3; | 在每次循环迭代之前检查,如果为false ,进入循环 |
body(循环体) | alert(i); | 条件为真时,重复运行 |
step | i++; | 在每次循环迭代后执行 |
一般循环算法的工作原理如下:
开始运行
→ (如果 condition 成立 → 运行 body 然后运行 step)
→ (如果 condition 成立 → 运行 body 然后运行 step)
→ (如果 condition 成立 → 运行 body 然后运行 step)
→ ...
2
3
4
5
# 跳出循环
通常条件为假时,循环会终止。
但我们随时都可以使用 break
指令强制退出。
# 继续下一次迭代
continue
指令是 break
的“轻量版”。它不会停掉整个循环。而是停止当前这一次迭代,并强制启动新一轮循环(如果条件允许的话)。
如果我们完成了当前的迭代,并且希望继续执行下一次迭代,我们就可以使用它。
下面这个循环使用 continue
来只输出奇数:
for (let i = 0; i < 10; i++) {
//如果为真,跳过循环体的剩余部分。
if (i % 2 == 0) continue;
alert(i); // 1,然后 3,5,7,9
}
2
3
4
5
6
7
# 总结
我们学习了三种循环:
while
—— 每次迭代之前都要检查条件。do..while
—— 每次迭代后都要检查条件。for (;;)
—— 每次迭代之前都要检查条件,可以使用其他设置。
通常使用 while(true)
来构造“无限”循环。这样的循环和其他循环一样,都可以通过 break
指令来终止。
如果我们不想在当前迭代中做任何事,并且想要转移至下一次迭代,那么可以使用 continue
指令。