【问题标题】:Using spread syntax with function Arguments object将扩展语法与函数参数对象一起使用
【发布时间】:2017-02-08 00:05:23
【问题描述】:

我知道必须非常小心Arguments object这个函数

但是,将扩展语法与 Arguments 对象一起使用是否有任何已知的缺点(优化/性能问题)?或者这完全没问题?

我想从传递给函数的未知数量的参数创建一个数组:

function Numbers(){
    this.numbers = [...arguments];
}

A fiddle can be found here

它看起来很整洁,在关于 Arguments 对象的 MDN 页面中甚至建议我可以为此使用扩展语法:

正如你可以对任何类数组对象做的那样,你可以使用 ES2015 的 Array.from() 方法或 spread syntaxarguments 转换为真正的数组

但我还是想看看其他人对此是否有其他意见。

【问题讨论】:

    标签: javascript arrays arguments spread-syntax


    【解决方案1】:

    在 ES2015 中使用传播可以更清洁

    this.numbers = [...arguments];
    

    请记住,这在箭头函数中不起作用(没有arguments,你很好。 Rest arguments 和 Array.from 也是不错的其他选项。

    老式的 ES5 是:

    this.numbers = [].slice.call(arguments);
    

    【讨论】:

      【解决方案2】:

      人们说不要使用 arguments 对象的一个​​原因是它看起来像一个数组,但实际上不是:

      参数对象不是数组。它类似于 Array,但除了长度之外没有任何 Array 属性。例如,它没有 pop 方法。但是它可以转换为一个真正的数组:

      你很高兴来到这里,因为像 Array.from() 一样,展开运算符会生成一个新副本

      【讨论】:

      • 这是一个的原因。在松散模式下也会对性能产生影响,并且箭头函数没有自己的arguments 对象。
      【解决方案3】:

      arguments 中使用扩展符号(它不是运算符)很好。或者至少,使用arguments 和以往一样好。在 ES2015 及更高版本中(例如,如果您有扩展符号),使用 arguments 的调用非常有限。

      确实,您的示例中不需要:使用其余参数:

      function Numbers(...args){
          this.numbers = args;
      }
      

      在该示例中,args 是一个数组。一个真正的数组。

      【讨论】:

      • 很好,不知道我也可以这样做:)
      【解决方案4】:

      你也可以使用rest parameters:

      function Numbers(...numbers){
          this.numbers = numbers;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-12
        • 1970-01-01
        • 2011-03-08
        • 2017-04-19
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2017-06-07
        • 2017-09-27
        相关资源
        最近更新 更多