每次比较我和array.length时,Do循环是否检查array.length?
我正在浏览,我发现这一点:
var i, len;
for(i = 0, len = array.length; i < len; i++) {
//...
}
我的第一个想法是:
做正常的循环(那些不缓存长度的循环)每次检查array.length
?
由三部分组成的循环执行如下:
for (A; B; C)
A - Executed before the enumeration
B - condition to test
C - expression after each enumeration (so, not if B evaluated to false)
所以,是的:如果数组的构造方式for(var i=0; i<array.length; i++)
则在每个枚举处检查数组的.length
属性。 对于微型优化,将一个数组的长度存储在一个临时变量中是有效的(另请参阅:在JavaScript中循环数组的最快方式是什么?)。
等同for (var i=0; i<array.length; i++) { ... }
:
var i = 0;
while (i < array.length) {
...
i++;
}
Is it worth it? (obviously yes, why else he will do it this way?)
绝对没错。 因为,正如你所说,循环会每次计算数组长度。 所以这会造成巨大的开销。 在firebug或chrome dev工具中运行以下代码片段
// create an array with 50.000 items (function(){ window.items = []; for (var i = 0; i < 50000; i++) { items.push(i); } })(); // a profiler function that will return given function's execution time in milliseconds var getExecutionTime = function(fn) { var start = new Date().getTime(); fn(); var end = new Date().getTime(); console.log(end - start); } var optimized = function() { var newItems = []; for (var i = 0, len = items.length; i < len; i++) { newItems.push(items[i]); } }; var unOptimized = function() { var newItems= []; for (var i = 0; i < items.length; i++) { newItems.push(items[i]); } }; getExecutionTime(optimized); getExecutionTime(unOptimized);
以下是各种浏览器中的近似结果
Browser optimized unOptimized Firefox 14 26 Chrome 15 32 IE9 22 40 IE8 82 157 IE7 76 148
所以再考虑一下,并使用优化方式:)
注意:我试图在jsPerf上使用此代码,但现在无法访问jsPerf。 我想,当我尝试时,它会下降。
如果array.length是一个计算值(在您的示例中不太可能),那么最好一次检索该值并将其存储在变量中。
如果array.length没有被计算(在你的例子中可能是这种情况),那么检索长度并将其存储在变量中是没有价值的。
上一篇: Do loops check the array.length every time when comparing i against array.length?