使用带有Arguments对象的扩展语法

时间:2016-09-29 15:15:22

标签: javascript arrays arguments spread-syntax

我知道必须对函数Arguments object

非常小心

但是使用带有Arguments对象的扩展语法有任何已知的缺点(优化/性能问题)吗?或者这完全可以吗?

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

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

A fiddle can be found here

它看起来很整洁,在MDN页面中有关Arguments对象的建议我甚至可以使用spread运算符:

  

您还可以使用Array.from()方法或扩展运算符将参数转换为实数数组。

但我还是想看看别人是否对此有另一种意见。

4 个答案:

答案 0 :(得分:4)

您还可以使用rest parameters

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

答案 1 :(得分:2)

它完全没问题,与老式的ES5相比没有任何缺点

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

使用传播在ES2015中做同样的事情清洁

this.numbers = [...arguments];

请记住,它不会在箭头功能(没有arguments中工作,而且你很好。 Rest参数和Array.from也是其他选项。

答案 2 :(得分:1)

使用arguments的扩展符号(它不是运算符)可以。或者至少,它与使用arguments一样好。在ES2015及更高版本中(例如,如果您有扩展表示法),使用arguments的呼叫非常有限。

事实上,在你的例子中没有必要:使用rest参数:

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

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

答案 3 :(得分:0)

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

  

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

你很高兴去这里,因为像Array.from()一样,传播运算符会创建一个新副本