在javascript中迭代项目的最佳方法是什么?

时间:2012-09-10 18:30:15

标签: javascript for-loop undefined

我最近通过一种不同的方式循环使用Javascript中的数组。

我曾经写过像这样的循环:

for (var len = 0; len < testData.length; len++) {
  total = total + testData[len];
}

我读了一些以这种方式做到的代码:

for (var len = 0; testData[len]; len++) {
  total = total + testData[len];
}

我想知道这些会如何表现,所以我用jsPerf来查找它。结果非常惊人。我预计第二种方法比第一种方法快一点,但它实际上要快得多。

我在这里失踪了吗?或者这是循环列表项的最佳方式。

更新

灰色状态即将到来并且Diode向我指出了测试用例中的一个简单缺陷,它似乎更快。

纠正错误后,这是最快的:

var datalen = testData.length;
for (var len = 0; len <datalen; len++) {
     total = total + testData[len];
}

更新2:

在更多浏览器中测试后,此测试用例再次采用不同的方向。 只有在Chrome和Opera中,正常的循环才是最快的。在其他所有浏览器中, Shmiddty 的方式只是快一点。

var i = testData.length, sum=0;
while (i--){
    sum += testData[i];
}

6 个答案:

答案 0 :(得分:13)

我认为第一种形式更好。第二种形式有一些问题。如果您有一个包含falsy值的稀疏数组怎么办?喜欢:var testData = [ "text", undefined, false, 0, 5 ];

我还希望第一种形式表现更好。特别是如果你'缓存'testData.length的价值,就像这样:

var i, len = testData.length;
for (i = 0; i < len; i += 1) {
  total = total + testData[i];
}

答案 1 :(得分:4)


更新:我错了,forEach非常慢!似乎循环更好


您应该使用ECMAScript第5版中定义的forEach

testData.forEach(function(val,i,arr){
    total += val;
});

参数是:

  • val是当前值
  • i是当前索引
  • arr是数组

您不必全部使用它们:

testData.forEach(function(val){
    total += val;
});

对于不支持它的浏览器,可以使用此填充程序:

if(!Array.prototype.forEach){
    Array.prototype.forEach = function(fn, scope) {
        for(var i = 0, len = this.length; i < len; ++i) {
            fn.call(scope || this, this[i], i, this);
        }
    }
}

有关详细信息,请参阅Array.forEach

答案 2 :(得分:3)

你也可以像这样循环:

var i = testData.length;

while (i--){
    console.log(testData[i]);
}

请注意,它会向后遍历数组

或者,总结:

var i = testData.length, sum=0;

while (i--){
    sum += testData[i];
}

答案 3 :(得分:2)

根据Shmiddt的回答,您可以向后使用循环。它看起来比Firefox上的一段时间要快一点,而且在Chrome上他们并列:

var total = 0;
for (var len = testData.length-1; len >=0; len--) {
  total += testData[len];
}

测试:http://jsperf.com/for-until-length-vs-until-undefined/10

答案 4 :(得分:1)

关于性能,testData[len]只检查元素是否已定义,而不是null / false /&#34; falsish&#34;,这比比较更快,特别是为每个检索testData.length迭代。

所以第二种方式更快,但不是更可靠 - 正如Frits van Campen所说的那样。

答案 5 :(得分:1)

您的设置代码插入0会导致循环在第一个条件下中断

var testData = [];
for (var i = 0; i < 1000; i++) {
  testData.push(i);  // pushes 0 to `testData`
}


for (var len = 0; testData[len]; len++) {   // loop breaks on first condition-check as testData[0] is 0.
  total = total + testData[len];
}

更改下面给出的设置代码并查看差异

var testData = [];
for (var i = 0; i < 1000; i++) {
  testData.push(i+1);
}

http://jsperf.com/for-until-length-vs-until-undefined/6