У меня есть число, и я хочу найти сумму квадратов каждой цифры. Я начал с того, что превратил его в строку, разбил ее, чтобы получить массив строк, представляющих каждую цифру, а затем использовал сокращение, чтобы найти сумму квадратов. Я получил правильный результат с кодом ниже, но я не понимаю, почему он работает. 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.info(result);И приведенный выше код выдает 82 (это то, что я хочу), но я не знаю, почему это работает.
sum — это число, а Math.pow возвращает число. Для вашего оператора + нет строкового операнда. Вы бы увидели ожидаемое поведение, если бы использовали '0' в качестве начального значения для sum вместо 0.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Второй аргумент, переданный reduce, будет начальным значением аккумулятора. Здесь вы прошли 0:
num.toString().split('').reduce(function(sum, curr) {
return sum + Math.pow(curr, 2);
}, 0)
// ^
Таким образом, значение sum в первой итерации — это число. Затем вы добавляете к нему число, в результате чего получается число еще один, которое становится аккумулятором в следующей итерации — и так до конца. Аккумулятор всегда является числом.
Если бы вы не было указали начальное значение, первым значением аккумулятора был бы первый элемент в массиве (символ '1'), и все было бы объединенный, а не добавлено:
let num = 19
const result = num.toString().split('').reduce(function(sum, curr) {
return sum + Math.pow(curr, 2);
})
console.info(result);Результат '181' потому что '1' + 81 === '181'.
Но мой массив ['1', '9']. Итак, в первой итерации я добавляю 0 + «1»? Что должно привести к сумме «1»?
Math.pow возвращает число. В первой итерации return sum + Math.pow(curr, 2); преобразуется в return 0 + Math.pow('1', 2); -> return 0 + 1; -> return 1.
OHH подождите, я вижу, что происходит сейчас. Не бери в голову! Спасибо
1^2 + 9^2 = 1 + 81 = 82