8

我知道必须非常小心函数参数对象

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

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

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

可以在这里找到小提琴

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

就像你可以对任何类似数组的对象做的那样,你可以使用 ES2015 的Array.from()方法或传播语法来转换arguments为真正的数组

但我仍然想看看其他人是否对此有其他看法。

4

4 回答 4

6

您还可以使用休息参数

function Numbers(...numbers){
    this.numbers = numbers;
}
于 2016-09-29T15:17:56.520 回答
3

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

this.numbers = [...arguments];

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

老式的 ES5 是:

this.numbers = [].slice.call(arguments);
于 2016-09-29T15:17:05.240 回答
1

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

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

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

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

于 2016-09-29T15:18:01.213 回答
0

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

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

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

于 2016-09-29T15:18:03.333 回答