我在 map 和 foreach 中看到的唯一区别是 map
返回一个数组而 forEach
不是。但是,我什至不理解forEach
方法的最后一行“func.call(scope, this[i], i, this);
”。例如,不是“this
”和“scope
”指的是同一个对象,也不是this[i]
和 i
指的是循环中的当前值?
我注意到在另一篇文章中有人说“当你想在列表的每个元素的基础上做某事时使用 forEach
。例如,你可能会向页面添加东西。本质上,当您想要“副作用”时,它非常有用。我不知道副作用是什么意思。
Array.prototype.map = function(fnc) {
var a = new Array(this.length);
for (var i = 0; i < this.length; i++) {
a[i] = fnc(this[i]);
}
return a;
}
Array.prototype.forEach = function(func, scope) {
scope = scope || this;
for (var i = 0, l = this.length; i < l; i++) {
func.call(scope, this[i], i, this);
}
}
最后,除了像下面这样操作数字之外,JavaScript 中的这些方法是否有任何实际用途(因为我们没有更新数据库)?
alert([1,2,3,4].map(function(x){ return x + 1})); // This is the only example I ever see of map in JavaScript.
最佳答案
在您的示例中,map
和 forEach
之间的本质区别是 forEach
对原始数组元素进行操作,而 map
结果显式返回一个新数组。
使用 forEach
,您将对原始数组中的每个元素采取一些行动,并可选择更改这些元素。 forEach
方法运行您为每个元素提供的函数,但不返回任何内容 (undefined
)。另一方面,map
遍历数组,对每个元素应用一个函数,然后将结果作为新数组发出。
forEach
的“副作用”是改变了原始数组。 map
的“无副作用”意味着,在惯用用法中,原始数组元素没有改变;新数组是原始数组中每个元素的一对一映射——映射转换是您提供的函数。
事实上,不涉及数据库并不意味着您不必对数据结构进行操作,毕竟,这是任何语言编程的本质之一。至于你最后一个问题,你的数组不仅可以包含数字,还可以包含对象、字符串、函数等。
关于javascript - JavaScript forEach 方法有什么用(map 做不到)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034392/