我知道必须对函数Arguments object
非常小心但是使用带有Arguments对象的扩展语法有任何已知的缺点(优化/性能问题)吗?或者这完全可以吗?
我想从传递给函数的未知数量的参数创建一个数组:
function Numbers(){
this.numbers = [...arguments];
}
它看起来很整洁,在MDN页面中有关Arguments对象的建议我甚至可以使用spread运算符:
您还可以使用
Array.from()
方法或扩展运算符将参数转换为实数数组。
但我还是想看看别人是否对此有另一种意见。
答案 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()一样,传播运算符会创建一个新副本