Ответ 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
переменную и оптимизируя ваш код.