注册 登录
编程论坛 JavaScript论坛

js 循环论

wangnannan 发布于 2015-05-21 14:47, 1688 次点击
闲来无事 根据最近项目经验 总结来一帖 今天跟大家说说我对JS优化循环的理解 废话少说 咱们开始
可以使用下面几种方式来优化循环
 •减值迭代
大多数循环使用一个从0开始、增加到某个特定值的迭代器,在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效
 •简化终止条件
 
由于每次循环过程都会计算终止条件,所以必须保证它尽可能快,也就是说避免属性查找或者其它的操作,最好是将循环控制量保存到局部变量中,也就是说对数组或列表对象的遍历时,提前将length保存到局部变量中,避免在循环的每
程序代码:
var list = document.getElementsByTagName('p');
        for (var i = 0; i < list.length; i++) {
            //……
        }
        //替换为:
        var list = document.getElementsByTagName('p');
        for (var i = 0, l = list.length; i < l; i++) {
            //……
        }
一步重复取值。
•简化循环体
 
循环体是执行最多的,所以要确保其被最大限度的优化
 •使用后测试循环
 
在JavaScript中,我们可以使用for(;;),while(),for(in)三种循环,事实上,这三种循环中for(in)的效率极差,因为他需要查询散列键,只要可以,就应该尽量少用。for(;;)和while循环,while循环的效率要优于for(;;),可能是因为for
程序代码:
var arr = [1, 2, 3, 4, 5, 6, 7];
        var sum = 0;
        for (var i = 0, l = arr.length; i < l; i++) {
            sum += arr[i];
        }
        //可以考虑替换为:
        var arr = [1, 2, 3, 4, 5, 6, 7];
        var sum = 0, l = arr.length;
        while (l--) {
            sum += arr[l];
        }
(;;)结构的问题,需要经常跳转回去。
最常用的for循环和while循环都是前测试循环,而如do-while这种后测试循环,可以避免最初终止条件的计算,因此运行更快。



 
12 回复
#2
wangnannan2015-05-21 14:49
程序代码:
//增值迭代 --效率较低
for(var i = 0;i < items.length;i++){
   doSomething(items[i]);
}
//减值迭代 --效率较高
for(var i = items.length - 1;i >= 0;i--){
   doSomething(items[i]);
}
减值迭代 不解释了 看代码 一眼便知
#3
wangnannan2015-05-21 14:50
习惯问题 只有不断总结才能提高 例如如下代码
程序代码:
// 创建两个对象 ----不好的方式
//
one 四条语句
var values = new Array();
values[0] = 123;
values[1] = 456;
values[2] = 789;
//two 四条语句
var person = new Object();
person.name = 'jozo';
person.age = 21;
person.sayName = function(){
    alert(this.name);
};

这样写没问题





#4
wangnannan2015-05-21 14:51
程序代码:
// 创建两个对象 ----推荐的方式
//
one 1条语句
var values = [123,456,789]
//two 1条语句
var person = {
    name : 'jozo',
    age : 21,
    sayName : function(){
    alert(this.name);
};
#5
wangnannan2015-05-21 14:52
但如果像上边这样写 则更有逻辑性
#6
wangnannan2015-05-21 14:52
最后总结一下 一句话 我觉得代码的质量和数量就是性能的评判标准 下个月在来 社团就拜托大家了


[ 本帖最后由 wangnannan 于 2015-5-21 14:54 编辑 ]
#7
不懂才问2015-05-21 15:08
回复 6楼 wangnannan
社团的兄弟们进步好快啊!
#8
冰镇柠檬汁儿2015-05-21 15:15
var list = document.getElementsByTagName('p');
for (var i = 0, l = list.length; i < l; i++) {
    //……
}
进一步的优化方式
var i=0,list = document.getElementsByTagName('p'),len=list.length;
for (; i < len; i++) {
    //……
}
这样可以减少一次var声明,优化脚本加载的初始化时间,但这样做其实意义不大
有一种终极的优化方式,据说可以让for循环提高20%以上的速度,不过代码写起来麻烦一些,并且只有在大量循环时才需要
#9
不懂才问2015-05-21 15:20
回复 8楼 冰镇柠檬汁儿
非常想学习“有一种终极的优化方式”
#10
冰镇柠檬汁儿2015-05-21 15:21
var list = document.getElementsByTagName('p'), len = list.length, i = 0,
    x = len % 10, y = Math.floor(len / 10);
for(i = 0; i < x; i++) {
    // 首先将余数数量的记录循环
}
for (i = 0; i < y; i++) {
    abc(i, list);
    abc(i + 1, list);
    abc(i + 2, list);
    // 以此类推写10遍
}
function abc(i, list){
    //....
}
#11
wmf20142015-05-22 09:58
回复 10楼 冰镇柠檬汁儿
这不是典型的以空间换时间嘛。
#12
hu9jj2015-05-22 16:04
看来楼主不仅仅是社团啊
#13
冰镇柠檬汁儿2015-05-23 14:08
以下是引用wmf2014在2015-5-22 09:58:22的发言:

这不是典型的以空间换时间嘛。

呵 呵,在大数据量的时候这种优化才有意义
1