Есть ли реальная польза для использования метода javascript Array reduce()? - программирование
Подтвердить что ты не робот

Есть ли реальная польза для использования метода javascript Array reduce()?

Большинство примеров использования метода reduce() можно легко переписать с помощью цикла for. И тестирование на JSPerf показывает, что reduce() обычно на 60% -75% медленнее, в зависимости от операций, выполняемых внутри каждой итерации.

Есть ли какая-то настоящая причина использовать reduce(), а не возможность писать код в "функциональном стиле"? Если вы можете получить прирост производительности на 60%, написав еще немного кода, зачем вам когда-либо использовать reduce()?

EDIT: Фактически, другие функциональные методы, такие как forEach() и map(), показывают сходную производительность, по меньшей мере на 60% медленнее, чем простые для циклов.

Здесь ссылка на тест JSPerf (с вызовами функций): forloop vs forEach

4b9b3361

Ответ 1

  • Возможно, вам понадобится обзор. Например, вы можете использовать функции обратного вызова или ссылаться на объекты javascript. Для получения дополнительной информации см., Почему javascript не заблокирован. [edit: современный javascript теперь поддерживает переменные let. Назад до ESv6, когда вы объявили переменную var, она поднялась, как если бы она была написана в верхней части функционального кода, поэтому вам часто приходилось писать тела функций for-loops как функции. Это все еще применяется, если:] Если у вас была написанная функция, она может также использовать функциональный стиль, если это не является значительным узким местом.
  • Ваш код не всегда должен работать на полной скорости машины. Возможно, вы даже не оптимизируете код в узком месте.
  • Кроме того, вы не предоставляете свое "тестирование на JSPerf", чтобы мы могли его критиковать. Например, если у вас уже есть функция сокращения (или функция map или forEach), то я уверен, что производительность будет на уровне. Даже если это не так, методология тестирования может быть ошибочной, особенно учитывая, что многие браузеры могут оптимизировать по-другому или иметь разные служебные служебные функции.

sidenote: это допустимое сравнение производительности между синтаксисом, но недопустимое сравнение производительности, когда синтаксис не является вопросом:

myArray.map(function(x){return x+1})

// ...versus...

for(var i=0; i<myArray.length; i++) {
    myArray[i] = myArray[i]+1;
}

Это будет действительное сравнение производительности:

myArray.forEach(function(x){return x+1})

// ...versus...

var plusOne = function(x){return x+1};
for(var i=0; i<myArray.length; i++) {
    plusOne(myArray[i]);
}

// (may need a side-effect if the compiler is smart enough to optimize this)

(Также в ответ на ваше редактирование: .forEach() и .map() обеспечивают гораздо большую ясность и избегают необходимости явных аргументов цикла int i=0; i<array.length; i++.)