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

.forEach()

Полное определение Array.prototype.forEach() в веб-документах MDN:

// Arrow function
forEach((element) => { … } )
forEach((element, index) => { … } )
forEach((element, index, array) => { … } )
// Callback function
forEach(callbackFn)
forEach(callbackFn, thisArg)
// Inline callback function
forEach(function(element) { … })
forEach(function(element, index) { … })
forEach(function(element, index, array){ … })
forEach(function(element, index, array) { … }, thisArg)```

Короче говоря, forEach() — это метод массива, который принимает предоставленную функцию и вызывает ее один раз для каждого элемента массива в порядке возрастания индекса. Предоставленная функция НЕ вызывается для неинициализированных или удаленных элементов. Например, forEach() применит предоставленную функцию к массиву[1,2,,3,4] только три раза.

Возвращаемое значение forEach() равно undefined. Это важно принять к сведению, так как это делает его несвязным. Типичный вариант использования — выполнение побочных эффектов либо само по себе, либо в конце цепочки методов.

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

.map()

Полное определение Array.prototype.map() в веб-документах MDN:

// Arrow function
map((element) => { ... })
map((element, index) => { ... })
map((element, index, array) => { ... })
// Callback function
map(callbackFn)
map(callbackFn, thisArg)
// Inline callback function
map(function(element) { ... })
map(function(element, index) { ... })
map(function(element, index, array){ ... })
map(function(element, index, array) { ... }, thisArg)

Основное различие между map() и forEach() заключается в том, что map() создает и возвращает новый массив, элементы которого являются результатом применения предоставленной функции к каждому элементу вызывающего массива. Предоставленная функция вызывается для всех элементов, которым назначено значение, даже если значение равно undefined. Она всегда возвращает то же количество значений, что и в исходном массиве.

Вот краткое описание поведения обоих методов:

Итак, когда мы должны использовать forEach() против map()? Поскольку map() создает новый массив, если вам не нужно использовать возвращаемый массив или возвращаемое значение из предоставленной функции, используйте forEach().. Если вам нужен возвращаемый массив для назначения другому массиву или цепочке для других методов массива, используйте map(). Кроме того, forEach() более производительен, чем map(), с точки зрения операций в секунду (читайте об этом здесь), так что это еще одно соображение, особенно если вам не требуется возвращаемый массив и вы имеете дело с большими наборами данных.

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

Удачного кодирования!