我最近一直在想。
我过去曾使用过[].slice.call
或[].forEach.call
....等等
我认为这样做很棒,因为它可以很容易地将类似的数组转换成数组。
但是,我开始考虑它,最好这样做:
而是Array.prototype.slice.call
或Array.prototype.forEach.call
。
我认为这有更好的表现,因为以下原因:
[].slice.call
会创建一个空白数组,然后访问数组原型,稍后需要进行垃圾回收。Array.prototype.slice.call
将直接调用Array原型方法,并且不会首先创建一个空白数组,然后遍历原型树。我有什么遗漏的吗?还有什么我缺少的,例如在某些情况下[]会比Array.prototype更好的原因吗?
答案 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的评论的链接也非常有趣。