【问题标题】:What is the difference between the wording of the first and second written [duplicate]第一次和第二次书面的措辞有什么区别[重复]
【发布时间】:2012-02-21 03:30:52
【问题描述】:

可能重复:
[].slice or Array.prototype.slice

第一个

(function() {
    var slice = Array.prototype.slice,
        aArguments = slice.apply(arguments);
})(10, 20, 30);

第二个

(function() {
    var aArguments = [].slice.apply(arguments);
})(10, 20, 30);

有什么区别?

只有速度?

【问题讨论】:

  • "只有速度?"这甚至有速度差异吗?
  • @Thilo 确实如此。 Array.prototype.slice[].slice
  • @Raynos——可能是因为第二个需要在每次计算表达式时创建一个新的(无用的)数组实例。更好的比较将使用 slice = [].slice; 但这不是 OP。对于一次性执行,这并不重要。
  • @RobG 即使它没有创建无用的实例,它仍然要检查 Array 对象是否有自己的名为"slice" 的属性,然后获取该对象的[[Prototype]],然后获取Array.prototype.slice 的函数
  • 对于单个操作,比较是[].slice vs Array.prototype.slice。数组位于全局对象上,因此需要 3 次查找才能到达 slice。最大的不同是必须为[].slice 创建一个数组,这减少了一次查找(假设不需要搜索[[Prototype]])。

标签: javascript


【解决方案1】:

在第二个版本中,您正在创建一个 Array 对象。

在第一个版本中,没有创建额外的对象 - 您直接引用 Array 原型上的函数并使用它。

【讨论】:

  • 你忘了缩小好处slice.apply缩小比[].slice.apply好很多
  • @Raynos 你能给出这个例子的缩小例子吗?
  • @Raynos - 临时变量可以与approaches 中的任何一个一起使用。我以为您指的是假设 OP 的两个示例都使用临时变量的情况下的缩小收益。
【解决方案2】:

只是获得相同.slice() 方法的不同方法。 Array.prototype 上的方法可用于所有 Array 对象。

  • 第一个需要更多的对象属性查找。

  • 第二个需要创建一个新的数组

性能考虑因素可能会因实现而异,并且可能很小。


请注意,如果您想要所有参数,也可以这样做...

var aArguments = Array.apply(null, arguments);

【讨论】:

    【解决方案3】:

    性能差异可以忽略不计。

    如果您想确切了解性能差异是什么,请查看this performance test 的结果,如果您愿意,可以自己运行。

    【讨论】:

    • 有人有这个问题吗?这是微不足道的。看图表。 =/
    猜你喜欢
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多