Я вызвал сокращение массива строк. Почему это приводит к числу?

У меня есть число, и я хочу найти сумму квадратов каждой цифры. Я начал с того, что превратил его в строку, разбил ее, чтобы получить массив строк, представляющих каждую цифру, а затем использовал сокращение, чтобы найти сумму квадратов. Я получил правильный результат с кодом ниже, но я не понимаю, почему он работает. 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 (это то, что я хочу), но я не знаю, почему это работает.

1^2 + 9^2 = 1 + 81 = 82
Nir Alfasi 12.07.2019 06:38
sum — это число, а Math.pow возвращает число. Для вашего оператора + нет строкового операнда. Вы бы увидели ожидаемое поведение, если бы использовали '0' в качестве начального значения для sum вместо 0.
Paul 12.07.2019 06:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Второй аргумент, переданный 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»?

emwhy 12.07.2019 06:42
Math.pow возвращает число. В первой итерации return sum + Math.pow(curr, 2); преобразуется в return 0 + Math.pow('1', 2); -> return 0 + 1; -> return 1.
CertainPerformance 12.07.2019 06:44

OHH подождите, я вижу, что происходит сейчас. Не бери в голову! Спасибо

emwhy 12.07.2019 06:45

Другие вопросы по теме