[] .slice.call vs Array.prototype.slice.call

时间:2014-05-14 09:03:26

标签: javascript performance

我最近一直在想。

我过去曾使用过[].slice.call[].forEach.call ....等等 我认为这样做很棒,因为它可以很容易地将类似的数组转换成数组。

但是,我开始考虑它,最好这样做: 而是Array.prototype.slice.callArray.prototype.forEach.call

我认为这有更好的表现,因为以下原因:

  1. [].slice.call会创建一个空白数组,然后访问数组原型,稍后需要进行垃圾回收。
  2. Array.prototype.slice.call将直接调用Array原型方法,并且不会首先创建一个空白数组,然后遍历原型树。
  3. 我有什么遗漏的吗?还有什么我缺少的,例如在某些情况下[]会比Array.prototype更好的原因吗?

1 个答案:

答案 0 :(得分:4)

请参阅现有基准

this one on jsperf.com一样,我找到了typing "`[].slice performance" on google

Revision 15 of the same benchmark也提供了各种各样的方法,而revision 12对我来说也很有趣。

使用什么代码

正如@Barmar在评论中指出的那样,[].slice.call Array.prototype.slice.call更短,所以看到前者是很常见的。

正如@ t.niese在评论中指出的那样,[].slice.call 会创建一个从未使用过的对象,即使它很可能不会对性能产生明显的影响

恕我直言,如果对性能感到担忧,我更喜欢在外部范围内使用bind创建快捷方式,然后使用它,而不是使用Array.prototype.slice.call 短暂 [].slice.call

var slice = Function.prototype.call.bind( Array.prototype.slice );

// and then just

function doSomething( ){
    slice( arguments );
    slice( arguments, 1, -1 );
}

slice( whatever );
slice( whatever, 0, 3 );

// and so on

结论

当然,正如在基准测试中所看到的,性能并不相同。

当效果真的很重要时,只需根据您的要求对您的代码进行基准测试以对其进行优化。

当性能无关紧要时,需要担心像这样的小改进,这是与代码风格相关的决定,因此请选择您的个人偏好或遵循您正在工作的项目的代码风格指南。

旁注

@Barmar发布了一条关于Premature Optimization的评论的链接也非常有趣。