我最近通过一种不同的方式循环使用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];
}
答案 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];
}
答案 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);
}