Разница между forEach и циклом в javascript
Мне интересно: существует ли существенная разница между циклами forEach
и for
в JavaScript.
Рассмотрим следующий пример:
var myArray = [1,2,3,4];
myArray.forEach(function(value) {
console.log(value);
});
for (var i = 0; i < myArray.length; i++) {
console.log(myArray[i]);
}
Вот часть моего исследования:
- Производительность. Согласно JsPerf: forEach немного медленнее, чем для цикла.
- Юзабилити. Мы не можем разорвать/вернуть из обратного вызова в случае цикла forEach.
Например: вы хотите узнать, является ли число простым или нет. Я думаю, что использование цикла for намного проще, чем использование цикла forEach для этого.
- Считывание: Использование цикла for делает код более читаемым, чем наличие forEach в коде.
- Совместимость с браузером: forEach не поддерживается в IE < 9 Таким образом, мы вводим некоторую меру в нашем коде.
Мои вопросы:
- В чем преимущества forEach over for loop?
- В каких сценариях более предпочтительным является forEach.
- Почему даже он появился в JavaScript? Почему это вообще нужно?
Ответы
Ответ 1
forEach
- это метод на Array
прототип. Он выполняет итерацию через каждый элемент массива и передает его функции обратного вызова.
Таким образом, в принципе forEach
является сокращенным методом для прецедента "передает каждый элемент Array
в function
". Вот общий пример, где я думаю, что Array.forEach
весьма полезен по сравнению с циклом for
:
// shortcut for document.querySelectorAll
function $$(expr, con) {
return Array.prototype.slice.call((con || document).querySelectorAll(expr));
}
// hide an element
function hide(el) {
el.style.display = 'none';
}
// hide all divs via forEach
$$('div').forEach(hide);
// hide all divs via for
for (var divs = $$('div'), i = 0; i < divs.length; i++) {
hide(divs[i])
}
Как вы можете видеть, читаемость инструкции forEach улучшена по сравнению с циклом for
.
С другой стороны, оператор for
более гибкий: он не обязательно включает массив. Производительность нормального цикла for
несколько лучше, потому что для каждого задействованного элемента нет вызова функции. Несмотря на это, рекомендуется избегать циклов for
, когда их можно записать в качестве оператора forEach
.
Ответ 2
В цикле forEach
вы не контролируете, как вы перебираете массив. Классический цикл for
позволяет вам выбрать алгоритм итерации по вашему желанию (i++
; i--
; i+=2*i
и т.д.).
Однако цикл forEach
намного проще в использовании - вам не нужно возиться со всеми подсчетами i
, находя объект array[i]
- JS делает это для вас.
Ответ 3
>> sparseArray = [1, 2, , 4];
>> sparseArray.forEach(console.log, console);
1 0 [1, 2, 3: 4]
2 1 [1, 2, 3: 4]
4 3 [1, 2, 3: 4]
>> for(var i = 0; i < sparseArray.length; ++i) { console.log(sparseArray[i]) };
1
2
undefined
4
forEach
является недавним дополнением к тому, чтобы в javascript можно было использовать экспрессивный стиль восприятия списков. Здесь вы можете видеть, что forEach
пропускает элементы, которые никогда не были установлены, но лучшее, что вы можете сделать с циклом for
, - это проверить на undefined
или null
, оба из которых можно установить как значения и выбрать на forEach
. Если вы не ожидаете пропущенных значений, forEach
эквивалентен циклам for
, но обратите внимание, что вы не можете остановить раньше, для чего вам нужно every
.
Ответ 4
Проще говоря, в соответствии с приведенной ниже статьей и исследованиями, кажется, что основные различия заключаются в следующем:
Для циклы
- Это один из оригинальных способов перебора массивов
- Это быстрее
- Вы могли бы
break
из этого использовать это ключевое слово
- На мой взгляд, он в основном используется для расчетов с целыми числами (числами)
- Параметры:
(iterator, counter, incrementor)
ForEach Loop
- Это новый способ с меньшим количеством кода для перебора массивов
- Легче читать
- Позволяет хранить переменные в области видимости
- Снижение вероятности случайных ошибок с помощью
i <= >= etc.....
- Параметры:
(iterator, Index of item, entire array)
https://alligator.io/js/foreach-vs-for-loops/