简答: 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 来解决Task 1 和Task 2 这两个任务。但是,您不能使用forEach 来解决Task 2。
在解决方案1中,如果您只是将forEach 替换为map,解决方案仍然有效。但是,在解决方案 2 中,将 map 替换为 forEach 会破坏您之前工作的解决方案。
根据map实现forEach:
实现map优越性的另一种方式是在map方面实现forEach。由于我们是优秀的程序员,我们不会沉迷于命名空间污染。我们会打电话给我们的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() 的力量。
Here's the official description of map()。请注意,map() 甚至可能会更改调用它的数组!欢呼map()。
希望这会有所帮助。
2015 年 11 月 10 日编辑:添加了详细说明。