在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?