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

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

  1. for (var i=0; i < 10; i++){
  2. //循环体
  3. }
    for循环是最常用的循环结构,它由4部分组成:初始化体、前测条件、后执行体、循环体。当遇到一个for循环时,初始化体首先执行,然后进入前测条件。如果前测条件的计算结果为true,则执行循环体,然后运行后执行体。for循环在封装上的直接性是开发者喜欢使用它的原因之一。

第二种循环是while循环。while 循环是一个简单的前测循环,由一个前测条件和一个循环体构成:

  1. var i = 0;
  2. while(i < 10){
  3. //循环体
  4. i++;
  5. }
    在执行循环体之前,先对前测条件进行计算。如果计算结果为true,那么就执行循环体;否则将跳过循环体。任何for 循环都可以写成while 循环,反之亦然。

第三种循环是do while循环。do while 循环是JavaScript中唯一一种后测试的循环,它包括两部分:循环体和后测条件。

  1. var i = 0;
  2. do {
  3. //循环体
  4. } while (i++ < 10);
    在一个do while 循环中,循环体至少运行一次,后测条件决定循环体是否应再次执行。

第四种循环是for in 循环。此循环有一个非常特殊的用途:可以枚举任何对象的命名属性。

  1. for (var prop in object){
  2. //循环体
  3. }
    每次执行循环,属性都被对象属性的名字(一个字符串)填充,直到所有的对象属性遍历完成才返回。返回的属性包括对象的实例属性和对象从原型链继承而来的属性。

提高循环性能的起点是选用哪种循环。在JavaScript 提供的4种循环类型中,只有for in循环执行速度比其他循环明显要慢。
由于每次迭代操作要搜索实例或原型的属性,for in循环每次迭代都要付出更多开销,因此它比其他类型循环执行速度慢一些。在同样的循环迭代操作中,其他类型循环执行速度比for in 循环快7 倍之多,因此推荐这样做:除非需要对数目不详的对象属性进行操作,否则避免使用for in循环。例如,迭代遍历一个有限的、已知的属性列表,使用其他循环类型更快,具体的使用模式如下:

  1. var props = ["prop1", "prop2"],
  2. i = 0;
  3. while (i < props.length){
  4. process(object[props[i]]);
  5. }
    此代码创建一个由成员和属性名构成的队列。while 循环用于遍历这几个属性并处理所对应的对象成员,而不是遍历对象的每个属性。此代码只关注感兴趣的属性,节约了循环时间。
时间: 2024-07-30 02:27:15

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

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编程建议——29:准确使用循环体(2)

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

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])).在这些简单的循环中,即使没有太多的代码,