首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[].slice.call诉Array.prototype.slice.call

[].slice.call诉Array.prototype.slice.call
EN

Stack Overflow用户
提问于 2014-05-14 09:03:25
回答 1查看 1.8K关注 0票数 3

我最近一直在想。

我过去用过[].slice.call[].forEach.call ..。等等,我认为这样做很棒,因为这样可以很容易地把数组变成数组。

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

我是否正确地认为这样做的表现要好得多,原因如下:

  1. [].slice.call将创建一个空白数组,然后访问数组原型,随后需要进行垃圾收集。
  2. Array.prototype.slice.call将直接调用Array方法,并且不会首先创建一个空白数组,然后遍历prototype树。

我错过了什么吗?另外,我是否遗漏了什么,比如为什么在某些情况下[]会比Array.prototype更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 09:22:37

请参阅现有基准

这个在jsperf.com上一样,我找到了在谷歌上输入“[].slice性能”

同一基准的第15修订版还提供了各种各样的方法,而第12修订版对我来说也很有趣。

使用什么代码

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

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

如果担心性能,我更喜欢在外部作用域上创建带有bind的快捷方式,然后使用它,而不是用[].slice.call简化Array.prototype.slice.call

代码语言:javascript
复制
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在关于早熟优化的评论上发布了一个链接,这个链接也很有趣。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23650116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档