@toha_man

Почему в методе reduce sum имеет строковый тип данных в моём коде?

Задачка простая, определить является ли число Стронг или нет. Стронг число , это такое число, где сумма факториалов составляющего его чисел равно ему же)))

145 = 1! + 4! + 5! - стронг
21 != 2! + 1! - не стронг

Но вопрос не о решении , а о том, почему в коде ниже в функции .reduce , агрегатор sum имеет строковый тип. Я понимаю что полученный после .split('') массив имеет строковый тип, но разве не произойдет преобразования к целому числу после отработки функции factorial ?

function strong(n) {
return (n).toString().split('').reduce( (sum, it, ind, arr) => +sum + factorial(it))  == n ? "STRONG!!!!" : "Not Strong !!";
}


function factorial(num) {
	return num == 1 ? 1 : num * factorial(num - 1);
}
  • Вопрос задан
  • 65 просмотров
Решения вопроса 2
avengerweb
@avengerweb
Веб-разработчик и не только
.reduce( (sum, it, ind, arr) => sum + factorial(it), 0)
https://developer.mozilla.org/ru/docs/Web/JavaScri...

При первом вызове функции, параметры accumulator и currentValue могут принимать одно из двух значений. Если при вызове reduce() передан аргумент initialValue, то значение accumulator будет равным значению initialValue, а значение currentValue будет равным первому значению в массиве. Если аргумент initialValue не задан, то значение accumulator будет равным первому значению в массиве, а значение currentValue будет равным второму значению в массиве.

Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError. Если массив состоит только из одного элемента (независимо от его положения в массиве) и аргумент initialValue не указан, или если аргумент initialValue указан, но массив пустой, то будет возвращено одно это значение, без вызова функции callback.


А так как первое значение у вас строка, то вот вам и ответ.
Ответ написан
Комментировать
@toha_man Автор вопроса
Сам отвечу. Потому что при вызове reduce с одним аргументом callback функции в значение sum передается первый аргумент перебираемого массива, а он строковый :

(n).toString().split('')[0] = "1" <- символ , и далее суммировав с ним получаем всегда строки.

Решение либо привести sum к числу добавив +sum, либо задать InitialValue для sum :
reduce( (args) => {func}, 0);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы