在第一次迭代之后,你将返回一个数字,然后try 将其属性x
添加到下一个对象,即undefined
,涉及undefined
的数学结果为NaN
.
try 返回一个包含x
个属性的对象,该属性包含以下参数的x个属性之和:
var arr = [{x:1},{x:2},{x:4}];
arr.reduce(function (a, b) {
return {x: a.x + b.x}; // returns object with property x
})
// ES6
arr.reduce((a, b) => ({x: a.x + b.x}));
// -> {x: 7}
从 comments 中添加的解释:
在下一次迭代中用作a
变量的每个迭代的返回值[].reduce
.
迭代1:a = {x:1}
、b = {x:2}
、{x: 3}
在迭代2中分配给a
迭代2:a = {x:3}
b = {x:4}
.
您的示例的问题在于您返回的是数字文字.
function (a, b) {
return a.x + b.x; // returns number literal
}
迭代1:a = {x:1}
b = {x:2}
// returns 3
作为下一次迭代的a
迭代2:a = 3
b = {x:2}
返回NaN
数字文字3
(通常)没有名为x
的属性,因此它是undefined
,undefined + b.x
返回NaN
,NaN + <anything>
始终是NaN
Clarification:我更喜欢我的方法,而不是这个线程中的另一个顶级答案,因为我不同意这样的观点,即传递一个可选参数来用一个魔术数字来减少,以获得一个数字基元更干净.它可能会导致写入的行数较少,但可读性较差.