我从书中学到,你应该这样写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
}
我只是想知道在实践中哪种方法是最好的?
当前回答
http://jsperf.com/caching-array-length/60
我准备的最新版本的test(通过重用旧版本)显示了一件事。
缓存长度并不是那么重要,但也没有坏处。
在Chrome、Opera和Firefox中,在我的Debian Squeeze 64位(我的桌面硬件)中,每次第一次运行上面链接的测试(在新打开的选项卡上),最后4个片段(图表中的第3、第5、第7和第10)的结果都是最好的。随后的运行给出了完全不同的结果。
性能方面的结论很简单:
使用for循环(向前)并使用!==而不是<进行测试。 如果以后不需要重用数组,那么while循环减去长度和破坏性shift()-ing数组也是有效的。
博士tl;
现在(2011.10)下面的模式看起来是最快的。
for (var i = 0, len = arr.length; i !== len; i++) {
...
}
注意缓存。长度在这里并不重要,所以您可以只测试I !== arr。长度和性能不会下降,但是代码会变短。
PS:我知道在snippet with shift()中,它的结果可以用来代替访问第0个元素,但我在重用以前的修订(有错误的while循环)后忽视了这一点,后来我不想失去已经获得的结果。
其他回答
“最好”是指纯粹的表演吗?还是性能和可读性?
纯性能“最佳”是这个,它使用缓存和++前缀操作符(我的数据:http://jsperf.com/caching-array-length/189)
for (var i = 0, len = myArray.length; i < len; ++i) {
// blah blah
}
我认为无缓存的for循环是执行时间和程序员读取时间的最佳平衡。每一个从C/ c++ /Java开始的程序员都不会浪费时间去阅读这本书
for(var i=0; i < arr.length; i++){
// blah blah
}
我所知道的最优雅的解决方案是使用地图。
var arr = [1,2,3];
arr.map(function(input){console.log(input);});
试试这个:
var myarray =[],
i = myarray.lenght;
while(i--){
// do somthing
}
截至2019年,WebWorker已经更加流行,对于大型数据集,我们可以使用WebWorker通过充分利用多核处理器来更快地处理。
我们还有Parallel.js,这使得WebWorker更容易用于数据处理。
循环javascript数组的最快方法是:
var len = arr.length;
while (len--) {
// blah blah
}
请看这篇文章的完整比较