在这种情况下,我猜测
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");
value
的大小和类型对于测试来说并不重要,因为JavaScript使用写时复制。为了让那些不熟悉JavaScript这个特性的读者信服,我们使用了一个较大(1kb)的value
。