ES6 JS 中的扩展语法如何作为函数参数工作?
How does the spread syntax in ES6 JS work as a function argument?
好的,所以我正在尝试了解新点差作为函数参数的工作原理。想象一个参数数量未知的函数,并将它们全部相加。
let addNums = ...a => a.reduce ((a,b) => a+b);
这个功能显然有效。那么,我的问题是什么?那么这里有一些观察结果,然后是我的问题:
- 作为函数参数/参数的扩展语法似乎旨在'spread'作为单独参数的值数组:
根据我所做的研究,扩展语法可用于将数组传递给不接受数组作为标准参数的函数,例如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
的数组需要事先为 declared/defined(在这种情况下 y
)
- 这是通过查看函数内部参数对象的长度来确认的
如果我使用 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
的变量 also 使用与具有扩展语法的函数参数同名。
对于更有经验的编码人员来说,这可能是显而易见的或微不足道的,但在我看来,这似乎与迄今为止提出的用例有悖常理,例如 将一组值分布在一组参数中未知长度。
事实上,当使用多个参数调用一个函数,但使用单个参数定义时,我会说远不如 跨参数读取和拆分 数组带有传播语法的参数,传播语法实际上类似于:Array.apply(null, arguments)
或 var a = [arg1, arg2, ...]
- ** 它是创建者而不是传播者 **
我的研究来源:
- http://es6-features.org/#SpreadOperator
- https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_Syntax
特别是对“@void 主要用于函数调用的问题的评论,即如果 myFunc 接受未知数量的参数,我们可以将参数作为数组传递给它。像这样:myFunc(... dynamicallyGeneratedArgs)"
经过更多研究,我找到了对所谓的 rest 参数的引用。
其余参数看起来像是使用 ...
扩展语法作为参数的一部分,但行为不同。他们实际上会收集无限数量的 arguments/parameters,然后将它们作为函数内的数组提供。
来源:link to MDN description of 'rest' parameters
基本上是我最初观察到的行为!
好的,所以我正在尝试了解新点差作为函数参数的工作原理。想象一个参数数量未知的函数,并将它们全部相加。
let addNums = ...a => a.reduce ((a,b) => a+b);
这个功能显然有效。那么,我的问题是什么?那么这里有一些观察结果,然后是我的问题:
- 作为函数参数/参数的扩展语法似乎旨在'spread'作为单独参数的值数组:
根据我所做的研究,扩展语法可用于将数组传递给不接受数组作为标准参数的函数,例如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
的数组需要事先为 declared/defined(在这种情况下 y
)
- 这是通过查看函数内部参数对象的长度来确认的
如果我使用 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
的变量 also 使用与具有扩展语法的函数参数同名。
对于更有经验的编码人员来说,这可能是显而易见的或微不足道的,但在我看来,这似乎与迄今为止提出的用例有悖常理,例如 将一组值分布在一组参数中未知长度。
事实上,当使用多个参数调用一个函数,但使用单个参数定义时,我会说远不如 跨参数读取和拆分 数组带有传播语法的参数,传播语法实际上类似于:Array.apply(null, arguments)
或 var a = [arg1, arg2, ...]
- ** 它是创建者而不是传播者 **
我的研究来源:
- http://es6-features.org/#SpreadOperator
- https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_Syntax
特别是对“@void 主要用于函数调用的问题的评论,即如果 myFunc 接受未知数量的参数,我们可以将参数作为数组传递给它。像这样:myFunc(... dynamicallyGeneratedArgs)"
经过更多研究,我找到了对所谓的 rest 参数的引用。
其余参数看起来像是使用 ...
扩展语法作为参数的一部分,但行为不同。他们实际上会收集无限数量的 arguments/parameters,然后将它们作为函数内的数组提供。
来源:link to MDN description of 'rest' parameters
基本上是我最初观察到的行为!