1.10 循环

商店忙碌时会有一个等候服务的顾客队列。如果这个队列中还有顾客,那么店员就要继续为下一位顾客服务。

重复一系列动作,直到不满足某个条件,换句话说,重复只发生在满足条件的情况下,这

就是程序循环的工作;循环有多种形式,但都满足基本的行为特性。

循环包括测试条件以及一个块(通常就是{ .. })。循环块的每次执行被称为一个迭代。比如,while循环和do..while循环形式展示了重复一个语句块直到一个条件判断求值不再为真这个概念:

        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(10个数字)。你可以设置一个i这样的循环迭代变量,初始为0,然后每次迭代增加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

在上述的示例中可以看到,两种情况下条件i <= 9对于前十次迭代都为true,但当i为10时会变为false。

for循环有3个分句:初始化分句(var 1 = 0)、条件测试分句(i <= 9),以及更新分句(i = i + 1)。所以,如果你需要在循环迭代中计数,那么最紧凑、最容易理解和编写的形式就是for循环。

还有其他一些特殊的循环形式,专门用于在特定的值上迭代,比如对象属性(参见第2章),其中隐式的测试条件为是否所有的属性都已经处理完毕。无论循环的形式是什么,“循环到条件为否”这个概念是保持不变的。