Javascript Уменьшить пустой массив

108

Когда я уменьшаю массив, я пытаюсь получить нулевое число, но я не совсем понимаю поведение функции

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

результат

TypeError: Reduce of empty array with no initial value

кажется, что если массив пуст, я не могу его уменьшить

[""].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

результат

""

Если единственный элемент в массиве - пустая строка, извлекает пустую строку

Agusgambina
источник

Ответы:

231

Второй параметр - для начального значения.

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
}, 0);

или используя ES6:

[].reduce( (previousValue, currentValue) => previousValue + currentValue, 0);
xdazz
источник
24

Оба поведения соответствуют спецификации .

Вы не можете reduceсоздать пустой массив, если явно не предоставите начальное «накопленное» значение в качестве второго аргумента:

Если значение initialValue не указано, то previousValue будет равно первому значению в массиве, а currentValue будет равно второму. Это ошибка TypeError, если массив не содержит элементов и не указано initialValue.

Если в массиве есть хотя бы один элемент, указывать начальное значение необязательно. Однако, если он не указан, то первый элемент массива используется как начальное значение и reduceпродолжает обрабатывать остальные элементы массива, вызывая ваш обратный вызов. В вашем случае массив содержит только один элемент, поэтому этот элемент становится начальным значением, а также конечным значением, поскольку больше нет элементов для обработки через обратный вызов.

Джон
источник