ES6 JS中的扩展语法如何作为函数参数工作?

时间:2016-06-09 06:26:22

标签: javascript operators spread-syntax

好的,所以我试图了解新的传播如何作为一个函数参数。想象一下具有未知数量参数的函数并将它们全部加在一起。

let addNums = ...a => a.reduce ((a,b) => a+b);

这个功能显然有效。那么,我的问题是什么?那么这里是一些观察,然后是我的问题:

  1. 传播语法作为函数参数/参数似乎旨在将值数组“扩展”为单独的参数:
  2. 根据我所做的研究,扩展语法可用于将数组传递给不接受数组作为标准参数的函数,例如: Array.prototype.push(),无需使用apply

    var x = [];
    var y = [1,2,3];
    // where Array.push(arg1,arg2,...) requires separate arguments this is now possible:
    x.push(...y);
    // which 'spreads' 'y' into separate arguments: x.push (arg1,arg2,...)
    

    但是在这种情况下传递给push的数组需要事先声明/定义(在本例中为y

    1. 通过查看函数
    2. 中参数对象的长度来确认

      如果我使用addNums(1,2,3,4),则arguments.length仍为== 4.因此,该函数似乎仍被称为addNums(1,2,3,4)

      问题

      我的问题是我没有用数组作为扩展语法处理的参数来调用addNums。我不是在调用addNums([1,2,3,...])我正在努力理解的行为是,似乎有一个秘密的隐藏步骤,给定一个用扩展语法声明的函数作为其单个参数:

      let x =  ...someSetOfValues => return something ;
      

      然后使用参数列表调用:

      x(1,2,3,4,...);
      

      生成arguments对象 AND 类型为Array的变量使用与相同的名称创建带有扩展语法的函数参数

      对于更有经验的编码人员来说,这可能是显而易见的,也可能是微不足道的,但在我看来,这对于迄今为止提出的用例来说是违反直觉的,例如在一组未知长度的参数中传播一组值< / em>的。

      事实上,当使用多个参数调用函数但是使用扩展语法的单个参数定义时,我会到目前为止所说的而不是在参数之间读取和拆分数组。 ,传播语法实际上与以下内容相似:Array.apply(null, arguments)var a = [arg1, arg2, ...] - **它是创作者而不是传播者**

      我的研究来源:

      特别是关于“@void主要用于函数调用的问题的评论,即如果myFunc使用未知数量的参数,我们可以将它作为带扩散的数组赋予它。就像这样:myFunc(... dynamicGeneratedArgs) “

1 个答案:

答案 0 :(得分:0)

在做了更多研究之后,我能够找到所谓的 rest 参数的参考。

Rest参数看起来像是使用...扩展语法作为参数的一部分,但表现不同。它们实际上会收集无限数量的参数/参数,然后将它们作为函数内的数组提供。

来源:link to MDN description of 'rest' parameters

基本上我在第一时间观察到的行为!