我说的是重型编码,比如图形或物理处理(非标准),速度很快。
var a=[0,1,2,3,4,5,6,7,8,9];
当你问
时会发生什么console.log(a.lengh);
是否就像访问一个在更改时更新的普通变量,或者每次真的计算一次?
说你是否有很多依赖于知道这个
的循环var i=flepdefloo; // some large number;
var a2=[];
while(i--){
a2[a2.length] = 'something';
}
是否应在单独的var?
中手动缓存/增加a2.length答案 0 :(得分:3)
每当数组发生变异时计算.length
的值,而不是在访问数组时计算> Object.getOwnPropertyDescriptor([], 'length');
Object {value: 0, writable: true, enumerable: false, configurable: false}
的值。至少according to the specification。
事实上,当我在Chrome中检查该属性时,它是一个正常的数据属性(不是getter或setter):
.push
但是,还有其他方法可以向数组添加元素。您可以使用arr.push(value);
:
var arr = new Array(length);
// ...
arr[i] = value;
您还可以使用特定长度初始化数组,并使用循环变量设置值(这需要您更改循环):
{{1}}
答案 1 :(得分:0)
大多数浏览器现在通过在编译之前对代码进行优化来实际处理此问题。你可以自己测试一下:
http://jsperf.com/array-length-caching-test
另外,您可能需要考虑使用
a2.push( "something" );
使用原生函数。