在这种情况下,我的猜测arrayLike[len++] = el
是对actualArray.push(el)
. 然而,在做了一个简单的基准测试(代码在结果下方提供)之后,似乎这种方法实际上比使用该push
方法以及使用相同构造技术的标准数组要慢。
结果(来自 OS X 10.5.8、FF 3.5.6)*:
push construction: 199ms (fastest)
indexed construction: 209ms
associative construction: 258ms (slowest)
总之,为什么 Closure 在这种情况下使用关联数组超出了我的理解。可能是有原因的(例如,这种技术可能在 Chrome 中表现得更好,或者不那么可疑,这种技术在未来的 JavaScript 引擎版本中可能会表现得更好),但在这种情况下我认为没有充分的理由。
* 未提供平均值,因为每次测试运行的时间不同,但始终导致相同的顺序。如果你有兴趣,你可以自己进行。
基准代码:
var MAX = 100000, i = 0,
a1 = {}, a2 = [], a3 = [],
value = "";
for ( i=0; i<1024; ++i ) {
value += "a";
}
console.time("associative construction");
for ( i=0; i<MAX; ++i ) {
a1[i] = value;
}
a1.length = i;
console.timeEnd("associative construction");
console.time("push construction");
for ( i=0; i<MAX; ++i ) {
a2.push(value);
}
console.timeEnd("push construction");
console.time("indexed construction");
for ( i=0; i<MAX; ++i ) {
a3[i] = value;
}
console.timeEnd("indexed construction");
由于 JavaScript 使用copy-on-write,因此大小和类型对value
测试无关紧要。一个大的(1kb)用于说服那些不熟悉 JavaScript 的这个特性的读者。value