JavaScript数组reduce中accumulator与value含义及代码执行疑问
嘿,我来帮你把这两个问题拆解开,讲得明明白白~
一、先搞懂reduce里的accumulator和currentValue
这俩是reduce方法回调函数里的核心参数,简单来说:
- accumulator(累加器):它就是个“结果容器”,每一次执行回调函数后,都会把返回值存在这里。第一次执行时,它要么是数组的第一个元素(没传初始值的情况),要么是你手动指定的初始值;之后每一轮都会承接上一次回调的结果,直到遍历完数组,它最终就是
reduce返回的结果。 - currentValue(当前值):就是当前正在遍历的数组元素,每一轮回调都会拿它和accumulator做你想要的操作(比如相加、拼接、筛选之类的)。
二、针对你那段代码的疑问解答
先把你给出的代码贴出来,方便咱们对着说:
[0, 1, 2, 3, 4].reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
1. 为什么返回10?
咱们一步步走一遍reduce的执行流程,你就懂了:
- 因为你没给
reduce传初始值,所以第一轮回调会拿数组的第一个元素0当accumulator,第二个元素1当currentValue,返回0+1=1; - 第二轮:accumulator变成上一轮的结果1,currentValue是数组第三个元素2,返回
1+2=3; - 第三轮:accumulator是3,currentValue是数组第四个元素3,返回
3+3=6; - 第四轮:accumulator是6,currentValue是数组第五个元素4,返回
6+4=10;
遍历完所有元素后,reduce就把最后这个10作为结果返回了。
2. 为什么浏览器里看不到内容?
因为你只是调用了reduce计算出结果,但没把结果输出呀!想在浏览器控制台看到这个10,得用console.log()把它包起来,改成这样:
console.log([0, 1, 2, 3, 4].reduce(function (accumulator, currentValue) { return accumulator + currentValue; }));
打开浏览器开发者工具(按F12)切换到Console标签,运行这段代码就能看到结果啦。
3. 第一个accumulator为什么是1而非0?
哎,这就奇怪了——你给出的代码里没传初始值,正常来说第一个accumulator应该是数组的第一个元素0才对。如果实际运行时第一个accumulator是1,那大概率是你调用reduce的时候不小心加了第三个参数(初始值),比如代码其实是这样的:
[0, 1, 2, 3, 4].reduce(function (accumulator, currentValue) { return accumulator + currentValue; }, 1);
这种情况下,第一轮accumulator就是你指定的初始值1,currentValue是数组第一个元素0,之后依次相加,最终结果会是11。你可以检查一下自己的代码是不是多传了这个初始值~
内容的提问来源于stack exchange,提问作者newtocode
相关产品推荐
相关产品推荐

