Выполни код. Тут 3 примера вызова reduce. В последнем console.log при вызове reduce аргументом передается результат вызова функции - 1 в 1 как у тебя. В первом - ака в документации что ты показал.
const arr = [1,2,3,4,5]
function sum(res, v) {
return res + v
}
console.log(arr.reduce(function (res, v) { return res + v }, 0))
console.log(arr.reduce(sum, 0))
console.log(arr.reduce(sum(0,0), 0))
Понял. Я отвечал все еще на TypeError: 0 is not a function.
TypeError: innerArr.reduce is not a function - эта про то что у innerArr нет метода reduce. И тут нужно использоват механический подход к поиску проблемы как я описывал раньше. Какие предположения ты будешь проверять в рамках этого подхода?
Я не знаю как ответить на этот вопрос. Давай я покажу свое решение а ты найдешь в нем вдохновение.
function magic(...args) {
let res = 0
function calc(...args) {
res = args.reduce((res, val) => res + val, res)
return calc
}
calc.valueOf = function () {
return res
}
return calc(...args)
}
console.log(magic(1,2,3)(1,2,3) == 12)
console.log(magic(1,2,3) == 6)
Благодарю! Видел уже подобное решение, надеялся написать своё. Сразу, что бросается в глаза, так это то, что:
ты пишешь функцию внутри reduce, а не выносишь её наружу
у тебя никто не ругается, что res и val не определены. не понятно, почему у меня ругается(вот поэтому у меня столько переменных в начале…)
ты используешь какой-то метод valueOf. Я пытался понять, что это, искал информацию, но пока не нашёл ничего достойного, нормально описывающего этот метод(без него, я заметил, ничего не работает) )
Смущает меня и то, что у тебя первый параметр функции совпадает со вторым параметром метода reduce(я про res). Ты извини, но мне кажется это не правильным. Только путает. Я изменил название и всё осталось таким же, рабочим)
Дебаггер это штука которая не всегда 1 в 1 работает как выполнение кода. Если ты поставишь console.log внутри функции то увидешь что она вызывается для каждого элемента массива. Твое представление о работе функции корректное.
magic() == 0; // true фишка сравнения (обрати внимание что оно нестрогое) в том что если с разных сторон неравенства стоят несовместимые типы, то интерпретатор пытается привести типы. Один из подкапотных шагов который он делает - вызов метода valueOf у несоответствующего типа. Мы уже определили что результат magic - должна быть функция. Если ей сделать метод valueOf который возвращает число, то он будет вызываться при нестрогом сравнении и поведение сравнении будет таким как ожидается.