我在字符串数组上调用了reduce。为什么会产生数字?

时间:2019-07-12 04:36:34

标签: javascript arrays reduce

我有一个数字,我想找到每个数字的平方和。我首先将其转换为字符串,将其拆分为代表每个数字的字符串数组,然后使用reduce求平方和。我在下面的代码中得到了正确的结果,但是我对它为什么起作用感到困惑。 Math.pow()会将数字转换为数字,但是如果将其添加到字符串中,不是将它们连接起来并生成字符串吗?就像我做了'1'+ Math.pow('2',2)一样,我期望的是'14'。

let num = 19

const result = num.toString().split('').reduce(function(sum, curr) {
    return sum + Math.pow(curr, 2);
}, 0)

console.log(result);

上面的代码产生82(这是我想要的),但我不知道为什么会起作用。

1 个答案:

答案 0 :(得分:3)

传递给reduce的第二个参数将是累加器的初始值。在这里,您传递了0:

num.toString().split('').reduce(function(sum, curr) {
    return sum + Math.pow(curr, 2);
}, 0)
// ^

因此,第一次迭代中sum的值是一个数字。然后,向其添加一个数字,该数字将导致另一个 数字,该数字将成为下一次迭代的累加器-依此类推,直到结束。累加器始终是数字。

如果没有指定初始值,则累加器的第一个值将是数组中的第一项(字符'1'),并且所有内容都将< em>串联,而不是添加:

let num = 19

const result = num.toString().split('').reduce(function(sum, curr) {
    return sum + Math.pow(curr, 2);
})
console.log(result);

结果是'181',因为'1' + 81 === '181'