JS编程建议——29:准确使用循环体(2)

建议29:准确使用循环体(2)
2.比较for和while
除for in 循环外,其他循环类型的性能相当,难以确定哪种循环执行速度更快。选择循环类型应基于需求而不是性能。
可以通过设计for和while循环来完成特定动作的重复性操作。下面分别从语义性、思维模式、达成目标这3个角度来分析如何正确选用while和for循环。
(1)从语义性角度比较
for和while循环可以按如下模式进行相互转换:

  1. for (initialization ; test ; increment ) // 声明并初始化循环变量、循环条件、递增循环变量
  2. statements // 可执行的循环语句
    相当于:
  3. initialization; // 声明并初始化循环变量
  4. while(test) { // 循环条件
  5. statement // 可执行的循环语句
  6. increment; // 递增循环变量
  7. }
    for循环是以循环变量的变化来控制循环进程的,即for循环的整个循环流程是预先计划好的,虽然中途可能会因存在异常或特别情况而退出循环,但是循环的规律性是有章可循的。这样我们能够很容易地预知循环的次数、每次循环的状态等信息。

while循环根据特定条件来决定循环操作,由于这个条件是动态的,无法预知条件何时为true或false,因此该循环的循环操作就具有很大的不确定性,每一次循环时都不知道下一次循环的状态如何,只能通过条件的动态变化来确定。
因此,for结构常常被用于有规律的重复操作中,如对数组、对象、集合等的操作。当然,对于这些对象的迭代操作,更适合使用for in这种特殊的for循环来操作,因为它提供了更大的便利,可以防止错误的发生。while循环更适合用于待定条件的重复操作,以及依据特定事件控制的循环等操作。
(2)从思维模式角度比较
for循环和while循环在思维模式上也存在差异。在for循环中,将循环的三要素(起始值、终止值和步长)定义为3个基本表达式作为结构语法的一部分固定在for语句内,使用小括号进行语法分隔,这与while循环中while语句内仅是条件检测的表达式截然不同,这样更有利于JavaScript进行快速预编译。
因此,当阅读到for结构的第一行代码时,就能够获取整个循环结构的控制方式,然后再根据上面的表达式来决定是否执行下面的循环体内的语句。可以这样概括,for结构适合简单的数值迭代操作。例如,快速阅读下面示例的代码:

  1. for(var n = 1; n < 10; n ++ ) {// 循环操作的环境条件
  2. alert(n); // 循环操作的语句
  3. }
    之后可以按以下方式对逻辑思维进行总结。

执行循环条件:1 < n < 10、步长为n++。
执行循环语句:alert(n)。
这种把循环操作的环境条件和循环操作语句分离开的设计模式能够提高程序的执行效率,同时也避免了因为把循环条件与循环语句混在一起而造成的遗漏或错误。

时间: 2024-11-09 00:58:05

JS编程建议——29:准确使用循环体(2)的相关文章

JS编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组

JS编程建议——29:准确使用循环体(3)

建议29:准确使用循环体(3)如果for循环的循环条件比较复杂,不是简单的数值迭代,这时for语句就必须考虑如何把循环条件和循环语句联系起来才可以正确地执行整个for循环.因此,根据for结构的运算顺序,for语句首先计算第一个和第二个表达式,然后执行循环体语句,最后返回执行for语句的第三个表达式,如此循环执行.例如: for(var a = true, b = 1; a; b ++ ){ if(b > 9) // 在循环体内间接计算迭代的步长 a = false; alert(b); } 在

JS编程建议——62:在循环体和异步回调中慎重使用闭包

建议62:在循环体和异步回调中慎重使用闭包闭包在开发中具有重要的应用价值,由于闭包具有持久性,生成的闭包不会立即被销毁,因此它会持续占用系统资源.如果大量使用闭包,将会造成系统资源紧张,甚至导致内存溢出等错误.另外,闭包在回调函数中会带来负面影响,因此在使用时应该慎重.下面的示例利用闭包来存储变量所有变化的值.function f( x ){ var a = []; for ( var i = 0; i < x.length; i ++ ){ var temp = x[i]; a.push( f

JS编程建议——50:正确检测数组类型

建议50:正确检测数组类型由于数组和对象的数据同源性,导致在JavaScript编程中经常会出现:在必须使用数组时使用了对象,或者在必须使用对象时使用了数组.选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组.否则,使用对象.JavaScript语言对数组和对象的区别是混乱的.typeof运算符检测数组的类型是"object",这没有什么意义,因此在正确检测数组和对象方面JavaScript没有提供很多的机制.这时可

JS编程建议——2:正确辨析JavaScript句法中的词、句和段

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词法侧重语言的底层实现(如语言编码问题等),以及基本规则的定义(如标识符.关键字.注释等).它们都不是最小的语义单位,却是构成语义单位的组成要素.例如,规范字符编码集合.命名规则.标识符.关键字.注释规则.特殊字符用法等.句法定义了语言的逻辑和结构,包括词.句和段的语法特性,其中段体现逻辑的结构,句表达

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——4:注意JavaScript数据类型的特殊性(1)

建议4:注意JavaScript数据类型的特殊性(1)1.防止浮点数溢出二进制的浮点数不能正确地处理十进制的小数,因此0.1+0.2不等于0.3. num = 0.1+0.2; //0.30000000000000004 这是JavaScript中最经常报告的Bug,并且这是遵循二进制浮点数算术标准(IEEE 754)而导致的结果.这个标准适合很多应用,但它违背了数字基本常识.幸运的是,浮点数中的整数运算是精确的,所以小数表现出来的问题可以通过指定精度来避免.例如,针对上面的相加可以这样进行处理

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——21:推荐提高循环性能的策略(2)

建议21:推荐提高循环性能的策略(2)在每个循环中,每次运行循环体都要发生如下操作:第1步,在控制条件中读一次属性(items.length).第2步,在控制条件中执行一次比较(i < items.length).第3步,比较操作,观察条件控制体的运算结果是不是true(i < items.length == true).第4步,一次自加操作(i++).第5步,一次数组查找(items[i]).第6步,一次函数调用(process(items[i])).在这些简单的循环中,即使没有太多的代码,