【发布时间】:2026-01-18 11:10:01
【问题描述】:
好的,所以我试图了解新的价差如何作为函数参数工作。想象一个具有未知数量参数的函数并将它们全部加在一起。
let addNums = ...a => a.reduce ((a,b) => a+b);
这个功能显然有效。那么,我的问题是什么?那么这里有一些观察,然后是我的问题:
- 作为函数参数/参数的传播语法似乎旨在将值数组“传播”为单独的参数:
根据我所做的研究,扩展语法可用于将数组传递给不接受数组作为标准参数的函数,例如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)
- 这可以通过查看函数内部参数对象的长度来确认
如果我使用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 类型的变量也创建了与函数参数同名的传播语法.
也许这对于更有经验的编码人员来说是显而易见的或微不足道的,但在我看来,这与迄今为止提出的用例是违反直觉的,例如 在一组未知长度的参数中传播一组值。
事实上,当使用多个参数调用函数但使用扩展语法使用单个参数定义时,我会说而不是跨参数读取和拆分数组,传播语法实际上类似于: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
- Spread Syntax ES6
特别是对问题“@void 主要用于函数调用的评论,即如果 myFunc 接受未知数量的参数,我们可以将参数作为带有展开的数组提供。像这样:myFunc(...dynamicallyGeneratedArgs) "
【问题讨论】:
标签: javascript operators spread-syntax