含Rest Operator的sum函数不同传参方式为何结果不同?
问题原因解析
这两段代码运行结果不同的核心问题,出在变量myValues的定义方式和函数参数传递的逻辑上:
1. 第一段代码的正常逻辑
你直接调用sum(1, 2, 3, 4)时,函数里的...array(剩余参数语法)会把传入的所有独立参数打包成数组[1,2,3,4],之后reduce遍历数组累加,自然得到总和10。
2. 第二段代码的问题所在
- 首先,
let myValues = (1, 2, 3, 4)这里用的是逗号运算符,不是定义数组。逗号运算符的规则是:依次执行所有操作数,最终返回最后一个操作数的值。所以myValues实际的值是4,根本不是你以为的包含四个数的集合。 - 当你调用
sum(myValues)时,...array会把单个参数4打包成数组[4],reduce遍历这个只有一个元素的数组,直接返回4,这就是你看到的结果。
正确的写法
如果想用变量传递多个参数,需要先把myValues定义成数组,再用展开语法把数组元素拆成独立参数传入函数:
function sum(...array) { return array.reduce((total, element) => { return total += element; }) } let myValues = [1, 2, 3, 4]; // 定义为数组 let total = sum(...myValues); // 用展开语法拆分数组元素 console.log(total); // 输出10
内容的提问来源于stack exchange,提问作者tompic93
相关产品推荐
相关产品推荐

