Каков текущий стандарт в 2017 году в Javascript с циклами for () по сравнению с .forEach.
Сейчас я работаю свой путь через Кольт Стил «Web Dev Bootcamp» на Udemy и он выступает forEach
над for
его учением. Тем не менее, я искал различные вещи во время упражнений в рамках курсовой работы и нахожу все больше и больше рекомендаций использовать for
-loop, а не forEach
. Большинство людей считают, что цикл for более эффективен.
Это что-то, что изменилось с момента написания курса (около 2015 года), или действительно есть их плюсы и минусы для каждого, который будет изучен с большим опытом.
Любой совет будет очень признателен.
javascript
loops
for-loop
foreach
тонироббинс
источник
источник
for
сложно превзойти по чистой скорости.forEach()
вызывает обратный вызов для каждой итерации; так что это, очевидно, влечет за собой некоторые накладные расходы.map
исключительно для итерации и отбрасывают новый массив, который он генерирует. Я не знаю, скольким людям мне пришлось исправить выбор этой конкретной функции только на этом сайте.Ответы:
для
for
петли намного эффективнее. Это конструкция цикла, специально разработанная для итерации, пока условие истинно , и в то же время предлагает пошаговый механизм (обычно для увеличения итератора). Пример:Это не означает, что for -loops всегда будет более эффективным, просто JS-движки и браузеры оптимизировали их для этого. На протяжении многих лет возникали компромиссы в отношении того, какая конструкция цикла более эффективна (для while, reduce, reverse-while и т. Д.) - разные браузеры и JS-движки имеют свои собственные реализации, которые предлагают разные методологии для получения тех же результатов. По мере дальнейшей оптимизации браузеров для удовлетворения требований к производительности, теоретически
[].forEach
можно было бы реализовать его таким образом, чтобы он был быстрее или сопоставим сfor
.Преимущества:
break
иcontinue
)i<n
может быть любым, не привязанным к размеру массива)var i
остаетсяi
доступной после завершения цикла)для каждого
.forEach
- это методы, которые в основном перебирают массивы (также и другие перечисляемые объекты , такие какMap
иSet
объекты). Они новее и содержат код, который субъективно легче читать. Пример:Преимущества:
В приведенном выше примере
val
это будет параметр вновь созданной функции. Таким образом, любые переменные, вызываемыеval
до цикла, сохранят свои значения после его завершения.Производительность
Производительность - непростая тема, которая обычно требует некоторого опыта, когда дело касается предусмотрительности или подхода. Чтобы заранее (при разработке) определить, какой объем оптимизации может потребоваться, программист должен иметь хорошее представление о прошлом опыте работы с проблемным случаем, а также хорошее понимание потенциальных решений.
Использование jQuery в некоторых случаях может быть слишком медленным временами (опытный разработчик может знать об этом), тогда как в других случаях может быть не проблема, и в этом случае совместимость библиотеки с кросс-браузером и простота выполнения других функций (например, AJAX, обработка событий) будет стоить сэкономленного времени на разработку (и обслуживание).
Другой пример: если бы производительность и оптимизация были всем, не было бы другого кода, кроме машинного или сборочного. Очевидно, что это не так, поскольку существует множество различных языков высокого и низкого уровня, каждый из которых имеет свои собственные компромиссы. Эти компромиссы включают в себя, помимо прочего, специализацию, простоту и скорость разработки, простоту и скорость обслуживания, оптимизированный код, код без ошибок и т. Д.
Подходить
Если у вас нет четкого представления о том, что для чего-то потребуется оптимизированный код, как правило, рекомендуется сначала написать поддерживаемый код. Оттуда вы можете протестировать и определить, что требует большего внимания, когда это необходимо.
Тем не менее, некоторые очевидные оптимизации должны быть частью общей практики и не требовать никаких размышлений. Например, рассмотрим следующий цикл:
Для каждой итерации цикла JavaScript
arr.length
извлекает операции расчета стоимости поиска ключа в каждом цикле. Нет причин, по которым этого не должно быть:Это делает то же самое, но извлекается только
arr.length
один раз, кэшируя переменную и оптимизируя ваш код.источник
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Я считаю, что сlet
заявлением для объявления локальной переменной области блока второе преимуществоforEach
больше не является преимуществом передfor
циклом, если только в среде без поддержкиlet
.