我最近一直在想。
我过去用过[].slice.call或[].forEach.call ..。等等,我认为这样做很棒,因为这样可以很容易地把数组变成数组。
但是,我开始考虑这个问题,最好这样做:Array.prototype.slice.call或Array.prototype.forEach.call。
我是否正确地认为这样做的表现要好得多,原因如下:
[].slice.call将创建一个空白数组,然后访问数组原型,随后需要进行垃圾收集。Array.prototype.slice.call将直接调用Array方法,并且不会首先创建一个空白数组,然后遍历prototype树。我错过了什么吗?另外,我是否遗漏了什么,比如为什么在某些情况下[]会比Array.prototype更好?
发布于 2014-05-14 09:22:37
请参阅现有基准
像这个在jsperf.com上一样,我找到了在谷歌上输入“[].slice性能”。
同一基准的第15修订版还提供了各种各样的方法,而第12修订版对我来说也很有趣。
使用什么代码
正如@Barmar在评论中指出的那样,[].slice.call比Array.prototype.slice.call短,所以看到前者是很常见的。
正如@t.niese在注释中指出的那样,[].slice.call创建了一个从未使用过的对象,尽管它很可能不会对性能产生明显的影响。
如果担心性能,我更喜欢在外部作用域上创建带有bind的快捷方式,然后使用它,而不是用[].slice.call简化Array.prototype.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在关于早熟优化的评论上发布了一个链接,这个链接也很有趣。
https://stackoverflow.com/questions/23650116
复制相似问题