在繁忙的时候,有一张排队单,上面记载着需要和手机店店员谈话的顾客。虽然排队单上还有许多人,但是她只需要持续服务下一位顾客就好了。

    重复一组动作直到特定的条件失败 —— 换句话说,仅在条件成立时重复 —— 就是程序循环的工作;循环可以有不同的形式,但是它们都符合这种基本行为。

    一个循环包含测试条件和一个块儿(通常是{ .. })。每次循环块儿执行,都称为一次 迭代

    例如,while循环和do..while循环形式就说明了这种概念 —— 重复一块儿语句直到一个条件不再求值得true

    1. while (numOfCustomers > 0) {
    2. console.log( "How may I help you?" );
    3. // 服务顾客……
    4. numOfCustomers = numOfCustomers - 1;
    5. }
    6. // 与
    7. do {
    8. console.log( "How may I help you?" );
    9. // 服务顾客……
    10. numOfCustomers = numOfCustomers - 1;
    11. } while (numOfCustomers > 0);

    这些循环之间唯一的实际区别是,条件是在第一次迭代之前(while)还是之后(do..while)被测试。

    在这两种形式中,如果条件测试得false,那么下一次迭代就不会运行。这意味着如果条件初始时就是false,那么while循环就永远不会运行,但是一个do..while循环将仅运行一次。

    有时你会为了计数一组特定的数字来进行循环,比如从09(十个数)。你可以通过设定一个值为0的循环迭代变量,比如i,并在每次迭代时将它递增1

    警告: 由于种种历史原因,编程语言几乎总是用从零开始的方式来计数的,这意味着计数开始于0而不是1。如果你不熟悉这种思维模式,一开始它可能十分令人困惑。为了更适应它,花些时间练习从0开始数数吧!

    条件在每次迭代时都会被测试,好像在循环内部有一个隐含的if语句一样。

    你可以使用JavaScript的break语句来停止一个循环。另外,我们可以看到如果没有break机制,就会极其容易地创造一个永远运行的循环。

    让我们展示一下:

    1. var i = 0;
    2. // 一个 `while..true` 循环将会永远运行,对吧?
    3. while (true) {
    4. // 停止循环?
    5. if ((i <= 9) === false) {
    6. break;
    7. }
    8. console.log( i );
    9. i = i + 1;
    10. }
    11. // 0 1 2 3 4 5 6 7 8 9

    警告: 这未必是你想在你的循环中使用的实际形式。它是仅为了说明的目的才出现在这里的。

    虽然一个while(或do..while)可以手动完成任务,但是为了同样的目的,还有一种称为for循环的语法形式:

    1. for (var i = 0; i <= 9; i = i + 1) {
    2. console.log( i );
    3. }
    4. // 0 1 2 3 4 5 6 7 8 9

    如你所见,对于这两种循环形式来说,前10次迭代(i的值从09)的条件i <= 9都是true,而且一旦i值为10就变为false

    for循环有三个子句:初始化子句(var i=0),条件测试子句(i <= 9),和更新子句(i = i + 1)。所以如果你想要使用循环迭代来计数,for是一个更紧凑而且更易理解和编写的形式。

    还有一些意在迭代特定的值的特殊循环形式,比如迭代一个对象的属性(见第二章),它隐含的测试条件是所有的属性是否都被处理过了。无论循环是何种形式,“循环直到条件失败”的概念是它们共有的。