Краткий ответ: map
и forEach
различны. Кроме того, неофициально говоря, map
является строгим надмножеством forEach
.
Длинный ответ: Во-первых, давайте придумаем описания в одну строку forEach
и map
:
forEach
выполняет итерацию по всем элементам, вызывая предоставленную функцию для каждого.
map
выполняет итерацию по всем элементам, вызывая предоставленную функцию для каждого, и создает преобразованный массив, запоминая результат каждого вызова функции.
Во многих языках forEach
часто называют просто each
. Следующее обсуждение использует JavaScript только для справки. Это может быть любой другой язык.
Теперь давайте используем каждую из этих функций.
Использование forEach
:
Задание 1: Напишите функцию printSquares
, которая принимает массив чисел arr
и печатает квадрат каждого элемента в нем.
Решение 1:
var printSquares = function (arr) {
arr.forEach(function (n) {
console.log(n * n);
});
};
Использование map
:
Задача 2: Напишите функцию selfDot
, которая принимает массив чисел arr
и возвращает массив, в котором каждый элемент является квадратом соответствующего элемента в arr
.
В сторону: здесь, в сленговом выражении, мы пытаемся возвести в квадрат входной массив. Формально говоря, мы пытаемся вычислить его точечное произведение с самим собой.
Решение 2:
var selfDot = function (arr) {
return arr.map(function (n) {
return n * n;
});
};
Как map
является надмножеством forEach
?
Вы можете использовать map
для решения обеих задач, Задача 1 и Задача 2 . Однако вы не можете использовать forEach
для решения Задачи 2 .
В Решение 1 , если вы просто замените forEach
на map
, решение останется в силе. Однако в Solution 2 замена map
на forEach
сломает ваше ранее работающее решение.
Реализация forEach
в терминах map
:
Другим способом реализации превосходства map
является реализация forEach
в терминах map
. Поскольку мы хорошие программисты, мы не будем заниматься загрязнением пространства имен. Мы позвоним нашим forEach
, просто each
.
Array.prototype.each = function (func) {
this.map(func);
};
Теперь, если вам не нравится ерунда prototype
, вот, пожалуйста,
var each = function (arr, func) {
arr.map(func); // Or map(arr, func);
};
Итак, хм .. Почему forEach
вообще существует?
Ответ - эффективность. Если вы не заинтересованы в преобразовании массива в другой массив, зачем вам вычислять преобразованный массив? Только чтобы свалить это? Конечно, нет! Если вы не хотите преобразование, вы не должны выполнять преобразование.
Таким образом, хотя карта может использоваться для решения Задачи 1 , она, вероятно, не должна. Для каждого это подходящий кандидат.
Оригинальный ответ:
Хотя я в значительной степени согласен с ответом @madlep, я хотел бы отметить, что map()
является строгим супер-набором из forEach()
.
Да, map()
обычно используется для создания нового массива. Однако он может также использоваться для изменения текущего массива.
Вот пример:
var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16]
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]
В приведенном выше примере a
было удобно установлено таким образом, чтобы a[i] === i
для i < a.length
. Несмотря на это, он демонстрирует силу map()
.
Вот официальное описание map()
. Обратите внимание, что map()
может даже изменить массив, в котором он вызывается! Радуйся map()
.
Надеюсь, это помогло.
Отредактировано 10 ноября 2015: добавлена разработка.