1

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

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

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

  1. 作为函数参数/参数的传播语法似乎旨在将值数组“传播”为单独的参数:

根据我所做的研究,扩展语法可用于将数组传递给不接受数组作为标准参数的函数,例如 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. 这可以通过查看函数内部参数对象的长度来确认

如果我使用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对象的生成,并且创建了一个类型的变量,其名称具有扩展语法的函数参数的名称相同Array

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

实际上,我想说的是,当使用多个参数调用函数但使用扩展语法使用单个参数定义时,不是跨参数读取和拆分数组,而是扩展语法实际上类似于:Array.apply(null, arguments)或者var a = [arg1, arg2, ...]- ** 它是创造者而不是传播者 **

我的研究来源:

特别是对问题的评论“@void 主要用于函数调用,即如果 myFunc 接受未知数量的参数,我们可以将参数作为带有扩展的数组提供。像这样:myFunc(...dynamicallyGeneratedArgs)”

4

1 回答 1

0

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

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

来源:链接到“rest”参数的 MDN 描述

基本上是我首先观察到的行为!

于 2016-06-09T06:38:04.017 回答