Эффективность Javascript: 'for' vs 'forEach'

Каков текущий стандарт в 2017 году в Javascript для циклов for() против .forEach.

В настоящее время я работаю через Colt Steeles "Web Dev Bootcamp" на Udemy, и он одобряет forEach над for в своих учениях. Тем не менее, я искал различные вещи во время упражнений в рамках курсовой работы, и я нахожу все больше рекомендаций по использованию for -loop, а не forEach. Большинство людей, похоже, считают, что цикл for более эффективен.

Является ли это тем, что изменилось с момента написания курса (около 2015 года) или их действительно плюсы и минусы для каждого из них, которые будут изучаться с большим опытом.

Приветствуются любые советы.

Ответ 1

за

for петель являются гораздо более эффективными. Это циклическая конструкция, специально разработанная для итерации, когда условие выполняется, и в то же время предлагает пошаговый механизм (обычно для увеличения итератора). Пример:

for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}

Это не значит, что циклы for всегда будут более эффективными, просто движки JS и браузеры оптимизировали их для этого. За прошедшие годы были достигнуты компромиссы в отношении того, какая циклическая конструкция более эффективна (например, для сокращения, обратного времени и т.д.) - разные браузеры и движки JS имеют свои собственные реализации, которые предлагают разные методологии для получения одинаковых результатов. По мере дальнейшей оптимизации браузеров в соответствии с требованиями к производительности теоретически [].forEach может быть реализован таким образом, чтобы он был быстрее или сопоставим с [].forEach for.

Выгоды:

  • эффективное
  • досрочное прекращение цикла ( с отличием break и continue)
  • управление состоянием (i<n может быть чем угодно и не связано с размером массива)
  • Переменные обзорный (var i листьев i доступен после того, как заканчивается цикл)

для каждого

.forEach - это методы, которые в основном перебирают массивы (также и другие перечисляемые, такие как объекты Map и Set). Они новее и предоставляют код, который субъективно легче читать. Пример:

[].forEach((val, index)=>{
   ...
});

Выгоды:

  • не требует установки переменных (перебирает каждый элемент массива)
  • functions/arrow-functions ограничивает переменную до блока
    В приведенном выше примере val будет параметром вновь созданной функции. Таким образом, любые переменные, называемые val до цикла, будут содержать свои значения после его окончания.
  • субъективно более удобен в обслуживании, так как может быть легче определить, что делает код - он перебирает перечисляемый; в то время как цикл for может использоваться для любого числа циклических схем

Спектакль

Производительность - сложная тема, которая обычно требует некоторого опыта, когда дело доходит до обдумывания или подхода. Чтобы заблаговременно (при разработке) определить, сколько оптимизации может потребоваться, программист должен иметь хорошее представление о прошлом опыте решения проблемы, а также хорошее понимание возможных решений.

Использование jQuery в некоторых случаях может быть слишком медленным (опытный разработчик может знать это), в то время как в других случаях это не проблема, в этом случае кросс-браузерная совместимость библиотеки и простота выполнения других функций (например, AJAX, обработка событий) стоила бы времени на разработку (и обслуживание).

Другой пример: если бы производительность и оптимизация были всем, не было бы другого кода, кроме машины или сборки. Очевидно, что это не так, поскольку существует много разных языков высокого уровня и низкого уровня, каждый из которых имеет свои собственные компромиссы. Эти компромиссы включают, но не ограничиваются специализацией, простотой и скоростью разработки, простотой и скоростью обслуживания, оптимизированным кодом, безошибочным кодом и т.д.

Подход

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

Тем не менее, некоторые очевидные оптимизации должны быть частью общей практики и не требуют каких-либо размышлений. Например, рассмотрим следующий цикл:

for (var i=0; i < arr.length; ++i ){}

Для каждой итерации цикла JavaScript arr.length, arr.length на операции поиска ключей в каждом цикле. Нет причины, почему это не должно быть:

for (var i=0, n=arr.length; i < n; ++i){}

Это делает то же самое, но извлекает arr.length только один раз, arr.length переменную и оптимизируя ваш код.