使用展开语法与函数参数对象

8

我知道使用Arguments对象函数时必须非常小心。

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

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

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

这里可以找到一个小例子

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

正如您可以使用任何类似数组的对象一样,您可以使用ES2015的Array.from()方法或展开语法arguments转换为真正的数组

但我仍然想知道其他人对此有什么看法。

4个回答

6
你也可以使用rest参数:

rest parameters

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

3

使用ES2015中的展开运算符可以更加简洁地实现同样的功能

this.numbers = [...arguments];

请记住,这种方法在箭头函数中不起作用(没有 arguments),其他可行的选项有 rest 参数和 Array.from。

旧式的 ES5 写法是:

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

1

使用扩展符号(它不是运算符)与 arguments 一起使用是可以的。或者至少,与使用 arguments 一样正常。在 ES2015 及以上版本中(例如,如果你使用扩展符号),使用 arguments 的情况非常有限。

实际上,在你的例子中没有必要使用 arguments:使用剩余参数即可:

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

在这个例子中,args是一个真正的数组。

1
不错,我也不知道我能做到这个 :) - Wilt

0

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

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

您可以放心使用这里的spread运算符,就像Array.from()一样,它会创建一个新的副本。


4
这是一个原因,松散模式下还会影响性能,箭头函数没有自己的 arguments 对象。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接