我从书中学到,你应该这样写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/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
}
其他回答
在使用大多数现代浏览器执行此测试后: https://jsben.ch/wY5fo
目前,最快的循环形式(在我看来也是语法上最明显的)。
具有长度缓存的标准for循环
var i = 0, len = myArray.length;
while (i < len) {
// your code
i++
}
我想说,这绝对是我为JavaScript引擎开发者喝彩的地方。运行时应该优化为清晰,而不是聪明。
现在是2022年底
有时根本没有用数组长度计算:
如果你有一个索引为var myArray =[1,2,3,4,25,99999999999999]的数组,使用任何索引为1的槽数组(包括forEach)的解决方案都是非常缓慢的。
对我来说,最好的解决方案是:
for(let _i in myArray ) {
if(myArray[_i]) {
(function(s) {
///
})(myArray[_i])
}
}
这似乎是目前为止最快的方法……
var el;
while (el = arr.shift()) {
el *= 2;
}
考虑到这将消耗数组,吃掉它,不留下任何东西……
现在是2017年。
我做了一些测试
https://jsperf.com/fastest-way-to-iterate-through-an-array/
看起来while方法在Chrome上是最快的。
看起来左边递减(——i)比Firefox上的其他递减(++i, i——,i++)快得多。
这种方法平均来说是最快的。但是它以相反的顺序迭代数组。
let i = array.length;
while (--i >= 0) {
doSomething(array[i]);
}
如果前向顺序很重要,可以使用这种方法。
let ii = array.length;
let i = 0;
while (i < ii) {
doSomething(array[i]);
++i;
}
基本的while循环通常是最快的。Jsperf.com是测试这类概念的一个很好的沙盒。
https://jsperf.com/fastest-array-loops-in-javascript/24