函数中的...args 和参数有什么区别

问题描述 投票:0回答:3

有什么区别

function(...args) {
  // args is an array
}

function() {
  // arguments is an array-like
}

既然将类数组转换为数组非常容易,那么还有其他区别吗?

类似的问题:

myFunction.apply(null, args);

myFunction(...args);
javascript function ecmascript-6
3个回答
6
投票
  1. ...args
    是新的;直到 ES6 才可用
  2. 您可以将其用于部分参数结构:
    function(foo, bar, ...others)
  3. 你得到一个数组,所以不再有
    Array.prototype.slice.call(arguments, 0)
  4. ...args
    对于代码阅读者来说更明显
  5. 现在有了火柴和打火机,我们就不需要擦木棍生火了

但是,作为 1 的推论,并非所有事物都支持它


2
投票

回复:

apply()
和传播之间的差异(当通过
null
或例如示例中的
thisArg
apply()
时):

myFunction.apply(null, args);
myFunction(...args);

除了 spread 是新的,因此目前没有得到广泛支持之外,

apply()
接受数组或类似数组的参数对象,而 spread 将适用于任何可迭代对象。例如,您可以将
Set
Map
作为参数传播,但无法将其作为
argArray
参数传递给
apply()
(尽管您当然可以将其作为
call()
的参数传播:
myFunction.call(whatever, ...someIterable)
)。

既然将类数组转换为数组非常容易,那么还有其他区别吗?

对于

arguments
来说,这并不是那么容易。做错了(或者根本做错了)可能会导致 JS 引擎去优化该函数,如果有正确的方法可以避免需要烦人的样板来完成它。


0
投票

来自 MDN,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters#the_difference_ Between_rest_parameters_and_the_arguments_object

剩余参数与实际参数之间有四个主要区别 参数对象:

  • arguments
    对象不是真正的数组,而其余参数是
    Array
    实例,表示诸如
    sort()
    map()
    forEach()
    pop()
    可以直接涂抹在上面。
  • arguments
    对象具有 附加(已弃用)
    callee
    属性。
  • 在非严格函数中 简单的参数,
    arguments
    对象将其索引与 参数值。其余参数数组永远不会更新其值 当重新分配命名参数时。
  • 其余参数包 所有额外参数放入一个数组中,但不包含任何 在
    ...restParam
    之前定义的命名参数。
    arguments
    对象 包含所有参数 - 包括中的参数
    ...restParam
    数组 — 捆绑到一个类似数组的对象中。
© www.soinside.com 2019 - 2024. All rights reserved.