在繁忙的时候,有一张排队单,上面记载着需要和手机店店员谈话的顾客。虽然排队单上还有许多人,但是她只需要持续服务下一位顾客就好了。
重复一组动作直到特定的条件失败 —— 换句话说,仅在条件成立时重复 —— 就是程序循环的工作;循环可以有不同的形式,但是它们都符合这种基本行为。
一个循环包含测试条件和一个块儿(通常是{ .. }
)。每次循环块儿执行,都称为一次 迭代。
例如,while
循环和do..while
循环形式就说明了这种概念 —— 重复一块儿语句直到一个条件不再求值得true
:
while (numOfCustomers > 0) {
console.log( "How may I help you?" );
// 服务顾客……
numOfCustomers = numOfCustomers - 1;
}
// 与
do {
console.log( "How may I help you?" );
// 服务顾客……
numOfCustomers = numOfCustomers - 1;
} while (numOfCustomers > 0);
这些循环之间唯一的实际区别是,条件是在第一次迭代之前(while
)还是之后(do..while
)被测试。
在这两种形式中,如果条件测试得false
,那么下一次迭代就不会运行。这意味着如果条件初始时就是false
,那么while
循环就永远不会运行,但是一个do..while
循环将仅运行一次。
有时你会为了计数一组特定的数字来进行循环,比如从0
到9
(十个数)。你可以通过设定一个值为0
的循环迭代变量,比如i
,并在每次迭代时将它递增1
。
警告: 由于种种历史原因,编程语言几乎总是用从零开始的方式来计数的,这意味着计数开始于0
而不是1
。如果你不熟悉这种思维模式,一开始它可能十分令人困惑。为了更适应它,花些时间练习从0
开始数数吧!
条件在每次迭代时都会被测试,好像在循环内部有一个隐含的if
语句一样。
你可以使用JavaScript的break
语句来停止一个循环。另外,我们可以看到如果没有break
机制,就会极其容易地创造一个永远运行的循环。
让我们展示一下:
var i = 0;
// 一个 `while..true` 循环将会永远运行,对吧?
while (true) {
// 停止循环?
if ((i <= 9) === false) {
break;
}
console.log( i );
i = i + 1;
}
// 0 1 2 3 4 5 6 7 8 9
警告: 这未必是你想在你的循环中使用的实际形式。它是仅为了说明的目的才出现在这里的。
虽然一个while
(或do..while
)可以手动完成任务,但是为了同样的目的,还有一种称为for
循环的语法形式:
for (var i = 0; i <= 9; i = i + 1) {
console.log( i );
}
// 0 1 2 3 4 5 6 7 8 9
如你所见,对于这两种循环形式来说,前10次迭代(i
的值从0
到9
)的条件i <= 9
都是true
,而且一旦i
值为10
就变为false
。
for
循环有三个子句:初始化子句(var i=0
),条件测试子句(i <= 9
),和更新子句(i = i + 1
)。所以如果你想要使用循环迭代来计数,for
是一个更紧凑而且更易理解和编写的形式。
还有一些意在迭代特定的值的特殊循环形式,比如迭代一个对象的属性(见第二章),它隐含的测试条件是所有的属性是否都被处理过了。无论循环是何种形式,“循环直到条件失败”的概念是它们共有的。