在JavaScript中,字符串/数组.length属性是否执行任何处理?

当遍历一个字符串或数组(或其他具有length属性的东西)时,我总是使用这样的循环:

var foo = [...];
var i;
for(i=0; i<foo.length; i++) {
    // do something
}

但是,我刚刚遇到了这样做的人:

var foo = [...];
var fooLen = foo.length;
var i;
for(i=0; i<fooLen; i++) {
    // do something
}

他说他认为“.length”正在重新计算长度,因此循环会重复计算字符串/数组的长度,所以通过将其长度保存为变量,它会更加优化。

我总是认为长度只是一个值属性,因为它使用的方式(它不是"asdf".length() ,它是"asdf".length ),但是这种情况并非如此吗?


在某些情况下,将长度放入局部变量比访问.length属性要快,并且它因浏览器而异。 关于SO和许多jsperf测试,已经有关于此的性能讨论。 在现代浏览器中,差异并不像我想象的那么多,但它们在某些情况下确实存在(我似乎无法找到那些以前的线程)。

还有不同类型的对象可能具有不同的性能特征。 例如,一个javascript数组可能具有不同于像getElementsByClassName()这样的一些DOM函数返回的类数组对象的性能特征。

而且,在某些情况下,您可能会将项目添加到数组的末尾,并且不希望迭代您添加的项目,以便在开始之前获得长度。


来自MDC

for (var i = 0; i < a.length; i++) {  
    // Do something with a[i]  
}  

这样做效率稍低,因为每个循环都要查找一次length属性。 一个改进是这样的:

for (var i = 0, len = a.length; i < len; i++) {  
    // Do something with a[i]  
} 

也许与“常规”数组差别不大,但对于像“node.children.length”这样的东西,我会在安全方面犯错,并且只会调用一次。 CoffeeScript会自动为你做到这一点。

请注意,如果在循环过程中长度可能发生变化,则会出现实际的行为差异。

链接地址: http://www.djcxy.com/p/70003.html

上一篇: In JavaScript, does the string/array .length property do any processing?

下一篇: JavaScript "cache" vs "memory"