здравствуйте! вопрос по теории. очень туплю в этом месте, просто поняла, что ...

здравствуйте! вопрос по теории. очень туплю в этом месте, просто поняла, что так надо делать, но до конца не совсем пониманию: const x = arr.reduce((acc, value) => [value, ...acc], []); почему так, со спредом аккумулятора, код работает, а если прямо в аккумулятор пушить нет: const x = arr.reduce((acc, value) => acc.push(value), []); typeerror: acc.push is not a function мы же в обоих случаях передаем в аккумулятор пустой массив..... 

приветствую, мария!

тут дело в том, что функция reduce на каждой итерации работает со значением аккумулятора, который был возвращён на предыдущей итерации. в первом случае: (acc, value) => [value, ...acc] функция возвращает массив, и он будет новым значением аккумулятора. а во втором случае: (acc, value) => acc.push(value) функция возвращает результат вызова метода push. а вызов данного метода возвращает новую длину массива, и это уже число. поэтому на следующей итерации возникнет ошибка, так как в acc содержится число, и попытка на числе вызвать метод push приведёт к ошибке. порекомендую вам посмотреть в документации какое значение возвращает метод push. 


станислав дзисяк, спасибо, действительно, пример с push абсолютно некорректный. получается, что без использования spread оператора никак не обойтись, если хочется использовать функции высшего порядка....


мария, приветствую!

ну спред, в данном случае самый простой способ, но есть и альтернативы. например, можно использовать метод concat, если требуется вернуть массив к которому нужно добавить элемент.


станислав дзисяк, спасибо за ответы! 


пожалуйста, мария :)