Наиболее существенное различие между for
циклом и forEach
методом заключается в том, что с первым вы можете break
выйти из цикла. Вы можете смоделировать continue
, просто вернувшись из функции, переданной в forEach
, но нет никакого способа полностью прекратить цикл.
Помимо этого, эти два компонента фактически выполняют одни и те же функции. Еще одно незначительное отличие заключается в области видимости индекса (и всех содержащихся переменных) в цикле for из-за подъема переменных.
for (var i = 0; i < arr.length; i++) { ... }
arr.forEach(function (el, i) { ... });
Однако я считаю, что forEach
это гораздо более выразительно - оно представляет ваше намерение перебрать каждый элемент массива и предоставляет вам ссылку на элемент, а не только на индекс. В целом, это в основном зависит от личного вкуса, но если вы можете использовать forEach
, я бы рекомендовал его использовать.
Между двумя версиями есть еще несколько существенных различий, особенно в отношении производительности. Фактически, простой цикл for работает значительно лучше, чем forEach
метод, как демонстрирует этот тест jsperf .
Вам решать, нужна ли вам такая производительность, и в большинстве случаев я бы предпочел выразительность скорости. Эта разница в скорости, вероятно, связана с небольшими семантическими различиями между базовым циклом и методом при работе с разреженными массивами, как указано в этом ответе .
Если вам не нужно поведение forEach
и / или вам нужно преждевременно выйти из цикла, вы можете использовать Lo-Dash _.each
в качестве альтернативы, которая также будет работать в кросс-браузере. Если вы используете jQuery, он также предоставляет аналогичный $.each
, просто обратите внимание на различия в аргументах, передаваемых функции обратного вызова в каждом варианте.
(Что касается forEach
полифила, он должен без проблем работать в старых браузерах, если вы решите пойти по этому пути.)
break
выйти изforEach
. Но большим преимуществом является создание новой области с функцией. С полифиллом проблем возникнуть не должно (по крайней мере, я не сталкивался с ними).