JS编程建议——33:优化循环结构

建议33:优化循环结构
循环是最浪费资源的一种流程。循环结构中一点小小的损耗都会被成倍放大,从而影响程序运行的效率。下面从以下几个方面介绍如何优化循环结构,从而提高循环结构的执行效率。
(1)优化结构
循环结构常常与分支结构混用在一起,因此如何嵌套就非常讲究了。例如,设计一个循环结构,结构内的循环语句只有在特定条件下才被执行。使用一个简单的例子来演示,其正常思维结构如下:

  1. var a = true;
  2. for(var b = 1; b < 10; b ++ ) { // 循环结构
  3. if(a == true) { // 条件判断
  4. }
  5. }
    很明显,在这个循环结构中if语句会被反复执行。如果这个if语句是一个固定的条件检测表达式,也就是说,如果if语句的条件不会受循环结构的影响,那么不妨采用如下的结构来设计:
  6. if(a == true) { // 条件判断
  7. for(var b = 1; b < 10; b ++ ) {// 循环结构
  8. }
  9. }
    这样,if语句只被执行一次,如果if条件不成立,则直接省略for语句的执行,从而使程序的执行效率大大提高。但是,如果if条件表达式受循环结构的制约,就不能够采用这种结构嵌套了。

(2)避免不必要的重复操作
在循环体内经常会存在不必要的损耗。例如,在下面的这个示例中,在循环内声明数组,然后读取数组元素的值。

  1. for(var b = 0; b < 10; b ++ ) {
  2. var a = new Array(1,2,3,4,5,6,7,8,9,10);
  3. alert(a[b]);
  4. }
    显然,在这个循环结构中,每循环一次都会重新定义数组,这样的设计极大地浪费了资源。如果把这个数组放在循环体外会更加高效,例如:
  5. var a = new Array(1,2,3,4,5,6,7,8,9,10);
  6. for(var b = 0; b < 10; b ++ ){
  7. alert(a[b]);
  8. }
    在日常开发中,类似这样不必要且重复的事情常常会浪费大量的系统资源,其实只要稍微留意,此类问题就会避免。

(3)妥善定义循环变量
对于for循环来说,它主要利用循环变量来控制整个结构的运行。当循环变量仅用于结构内部时,不妨在for语句中定义循环变量,这样能够优化循环结构。例如,计算1~100数字的和:

  1. var s = 0;
  2. for(var i = 0; i <= 100; i ++ ) {
  3. s += i;
  4. }
  5. alert(s);
    显然下面的做法就不是很妥当,因为单独定义循环变量,实际上增大了系统开销。
  6. var i = 0;
  7. var s = 0;
  8. for(i = 0; i <= 100; i ++ ) {
  9. s += i;
  10. }
  11. alert(s);
时间: 2024-09-20 18:32:24

JS编程建议——33:优化循环结构的相关文章

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

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

JS编程建议——15:避免使用continue

建议15:避免使用continuecontinue语句与break语句用法相似,在循环结构中用于控制逻辑的执行方向.break语句用于停止循环,而continue语句却用于再次执行循环.与break语句语法相同,continue语句可以跟随一个标签名,用来指定继续执行的循环结构的起始位置. continue label; 例如,在下面的这个示例中,当循环变量等于4时,会停止循环体内最后一句的执行,返回for语句起始位置继续执行下一次循环. for(var i=0; i<10;i++){ aler

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

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编程建议——37:推荐使用replace(2)

建议37:推荐使用replace(2)在上面的示例代码中,函数f()的参数为特殊字符"$1",它表示正则表达式/(bw+b)/中小括号每次匹配的文本.然后在函数体内对这个匹配文本进行处理,截取其首字母并转换为大写形式,之后返回新处理的字符串.replace方法能够在原文本中使用这个返回的新字符串替换每次匹配的子字符串.对于上面的示例,可以使用小括号来获取更多匹配文本的信息.例如,直接利用小括号传递单词的首字母,然后进行大小写转换处理: var s = 'script language

JS编程建议——35:获取字节长度

建议35:获取字节长度String对象的length属性能够返回字符串的长度,不管字符是单字节,还是双字节,都作为一个来计算.因此,要获取字符串的字节长度,必须通过手工计算获取,这里介绍两种方法.1)第一种方法是利用循环结构枚举每个字符,并根据字符的字符编码,判断当前字符是单字节还是双字节,然后递加字符串的字节数. String.prototype.lengthB = function( ){ var b = 0, l = this.length; if( l ){ for( var i = 0

JS编程建议——57:禁用Function构造函数

建议57:禁用Function构造函数定义函数的方法包括3种:function语句.Function构造函数和函数直接量.不管用哪种方法定义函数,它们都是Function对象的实例,并将继承Function对象所有默认或自定义的方法和属性.// 使用function语句编写函数function f(x){ return x; }// 使用Function()构造函数克隆函数var f = new Function("x", "return x;");// 使用函数直

JS编程建议——13:养成优化表达式的思维方式(1)

建议13:养成优化表达式的思维方式(1)对同一个表达式稍加改动就会打乱表达式的逻辑运算顺序,因此我们应该学会优化表达式的结构,不改变表达式的运算顺序和结果即可提高代码的可读性.1.第一种方式--加小括号例如,面对下面这个复杂表达式,可能被&&和||的优先级所迷惑. (a + b > c && a – b < c || a > b > c) 不过,如果进行如下优化,逻辑运算的顺序就会非常清晰了. ((a + b > c) && (