【发布时间】:2012-09-10 18:30:14
【问题描述】:
我最近遇到了一种在 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 中,正常的 for 循环是最快的。在其他所有其他浏览器中 Shmiddty 的方式只是快一点。
var i = testData.length, sum=0;
while (i--){
sum += testData[i];
}
【问题讨论】:
-
如果你想给一个变量添加一个值,你应该使用
+=而不是重复这个变量。 -
当你说“最好”时,你在寻找什么?速度、代码可读性、可靠性?你在循环什么样的数组?
-
如果
testData中有虚假值,那么第二个循环将提前停止。这可能是您看到的“性能提升”的一部分。 -
但是您的 JSPerf 测试存在很大缺陷。它似乎是如此之快,因为它在第一次迭代时因为
0值而停止。将初始化更改为以1开头而不是0,然后进行比较。for (var i = 1; i < 1000; i++) { -
更正的 JSPerf 测试显示了一个非常不同的结果。 jsperf.com/for-until-length-vs-until-undefined/7
标签: javascript for-loop undefined