我从书中学到,你应该这样写for循环:
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
所以arr。每次不计算长度。
其他人说编译器会做一些优化,所以你可以这样写:
for(var i=0; i < arr.length; i++){
// blah blah
}
我只是想知道在实践中哪种方法是最好的?
我从书中学到,你应该这样写for循环:
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
所以arr。每次不计算长度。
其他人说编译器会做一些优化,所以你可以这样写:
for(var i=0; i < arr.length; i++){
// blah blah
}
我只是想知道在实践中哪种方法是最好的?
当前回答
另一个jsperf.com测试:http://jsperf.com/while-reverse-vs-for-cached-length
反向while循环似乎是最快的。唯一的问题是while(——i)将停止于0。我怎么能访问数组[0]在我的循环那么?
其他回答
我在这里有个测试。检查这个! https://gist.github.com/DungGramer/7efdfefecaa1b8f5d6510202524dc751
我的结果:
pop是最快的,forEach的可读性和速度最好 while比for快 如果没有条件,循环更快(如if) i是最快的
我所知道的最优雅的解决方案是使用地图。
var arr = [1,2,3];
arr.map(function(input){console.log(input);});
循环javascript数组的最快方法是:
var len = arr.length;
while (len--) {
// blah blah
}
请看这篇文章的完整比较
虽然这是一个非常古老的问题,但也是一个非常有趣的问题,
请原谅我稍微改变一下这个问题,但我会在最后回答这个问题。
这个问题让我问自己,在js中是否有更好的循环方法:
所以我做了一些测试,以下是我的发现:
对于1000_000记录:最好是forEach。
对于100条记录:这根本不重要。
回到你刚才的问题:
我创建的例子和问题不完全一样。但我发现了一些有趣的事情:
首先,就像你说的,arr。如果它在比较语句I < arr内,Length每次都会计算。长度……
注意:下面的arrLength变量不超过1000_000条记录的数量。
例如:这不会工作
但是这个会
这需要0.036秒。与数字不变的情况相比,这是非常大的……
总之,
最好使用FOREACH
在你的例子中,i<arr。长度需要更多的时间(通常在1.3左右)
请参阅测试: 查看测试
var arr = []; // The array
var i = 0;
while (i < arr.length) {
// Do something with arr[i]
i++;
}
i++比++ I,——I和I——快
此外,您可以保存最后一次需要访问i时执行arr[i++]的最后一行(但这可能很难调试)。
您可以在这里(使用其他循环测试)测试它:http://jsperf.com/for-vs-whilepop/5