建议29:准确使用循环体(2)
2.比较for和while
除for in 循环外,其他循环类型的性能相当,难以确定哪种循环执行速度更快。选择循环类型应基于需求而不是性能。
可以通过设计for和while循环来完成特定动作的重复性操作。下面分别从语义性、思维模式、达成目标这3个角度来分析如何正确选用while和for循环。
(1)从语义性角度比较
for和while循环可以按如下模式进行相互转换:
- for (initialization ; test ; increment ) // 声明并初始化循环变量、循环条件、递增循环变量
- statements // 可执行的循环语句
相当于: - initialization; // 声明并初始化循环变量
- while(test) { // 循环条件
- statement // 可执行的循环语句
- increment; // 递增循环变量
- }
for循环是以循环变量的变化来控制循环进程的,即for循环的整个循环流程是预先计划好的,虽然中途可能会因存在异常或特别情况而退出循环,但是循环的规律性是有章可循的。这样我们能够很容易地预知循环的次数、每次循环的状态等信息。
while循环根据特定条件来决定循环操作,由于这个条件是动态的,无法预知条件何时为true或false,因此该循环的循环操作就具有很大的不确定性,每一次循环时都不知道下一次循环的状态如何,只能通过条件的动态变化来确定。
因此,for结构常常被用于有规律的重复操作中,如对数组、对象、集合等的操作。当然,对于这些对象的迭代操作,更适合使用for in这种特殊的for循环来操作,因为它提供了更大的便利,可以防止错误的发生。while循环更适合用于待定条件的重复操作,以及依据特定事件控制的循环等操作。
(2)从思维模式角度比较
for循环和while循环在思维模式上也存在差异。在for循环中,将循环的三要素(起始值、终止值和步长)定义为3个基本表达式作为结构语法的一部分固定在for语句内,使用小括号进行语法分隔,这与while循环中while语句内仅是条件检测的表达式截然不同,这样更有利于JavaScript进行快速预编译。
因此,当阅读到for结构的第一行代码时,就能够获取整个循环结构的控制方式,然后再根据上面的表达式来决定是否执行下面的循环体内的语句。可以这样概括,for结构适合简单的数值迭代操作。例如,快速阅读下面示例的代码:
- for(var n = 1; n < 10; n ++ ) {// 循环操作的环境条件
- alert(n); // 循环操作的语句
- }
之后可以按以下方式对逻辑思维进行总结。
执行循环条件:1 < n < 10、步长为n++。
执行循环语句:alert(n)。
这种把循环操作的环境条件和循环操作语句分离开的设计模式能够提高程序的执行效率,同时也避免了因为把循环条件与循环语句混在一起而造成的遗漏或错误。