【问题标题】:What's the difference between ...args and arguments in a function...args 和函数中的参数有什么区别
【发布时间】:2016-04-28 01:07:40
【问题描述】:

有什么区别

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

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

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

一个类似的问题:

myFunction.apply(null, args);

myFunction(...args);

【问题讨论】:

  • a quick google 肯定会在这里工作吗?点击第一次点击,搜索“...”,信息即将发布?
  • @Mike args 是一个任意名称,因此如果您希望看到标题为 Arguments 对象的页面,您不妨搜索 javascript arguments 来处理剩余参数。当然,如果您知道它们被称为休息参数,那最好搜索一下。
  • 我知道这看起来很简单,而且我知道下面回答的大部分内容。但是有很多毛茸茸的细节很容易被忽略或误解:) @Mike'Pomax'Kamermans
  • @JMM ...这更能说明问题吗?这对谷歌来说很容易,搜索关于“参数”的文档总是会发现你在同一文档中提到了“...args”符号。
  • @Mike 我不会总是说¯\_(ツ)_/¯。但可以肯定的是,OP 本可以寻找更多信息而不是发布。不过,你可以在这里说很多东西。

标签: javascript function ecmascript-6


【解决方案1】:
  1. ...args 是新的;直到 ES6 才可用
  2. 您可以将它用于部分参数结构:function(foo, bar, ...others)
  3. 你得到一个数组,所以没有更多Array.prototype.slice.call(arguments, 0)
  4. ...args 对代码阅读者来说更明显
  5. 现在有了火柴和打火机,我们就不用擦木棍来生火了

但是,作为 1 的推论,not everything supports it yet

【讨论】:

    【解决方案2】:

    Re:apply() 和 spread 之间的差异(当将 null 或例如 thisArg 传递给 apply() 时,如示例所示):

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

    除了 spread 是新的,因此目前没有得到广泛支持之外,apply() 接受一个数组或类似数组的参数对象,而 spread 将适用于任何可迭代对象。例如,您可以将SetMap 作为参数传播,而您不能将其作为argArray 参数传递给apply()(尽管您当然可以将其作为参数传播给call()myFunction.call(whatever, ...someIterable))。

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

    arguments 真的没那么容易。做错(或者根本做错)会导致 JS 引擎去优化函数,如果有正确的方法来避免它需要烦人的样板来做它。

    【讨论】:

    • 谢谢!可迭代是很容易被 IMO 误解的东西。
    猜你喜欢
    • 2018-03-10
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2010-09-14
    • 2020-10-23
    • 2014-09-03
    相关资源
    最近更新 更多