之前对 forEach 的理解就是 for 循环的另一种写法,直到遇到问题才发现自己的理解有问题。
先看一下 MDN 上对 forEach 的介绍:

forEach() 方法对数组的每个元素执行一次提供的函数。

然后 MDN 还给出了一段示例代码:

let a = ['a', 'b', 'c']
a.forEach(function (element) {
console.log(element)
})
// a
// b
// c

到这里都没有什么问题,接下来我写一个例子:

let a = [1, 2, 3]
a.forEach(function (element) {
return element
)
console.log(a) // [1, 2, 3]

return 无效,再换个方式:

let a = [1, 2, 3]
a.forEach(function (element) {
++element
)
console.log(a) // [1, 2, 3]

仍然无效,再来看一下 MDN 的文档:

array.forEach(callback (currentValue, index, array) {
//do something
}, this)
array.forEach(callback[, thisArg])

介绍:

forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数

文档中还写到 callback 函数的返回值为 undefined,到这里原因已经呼之欲出了,因为函数传递参数时基本数据类型按值传递,所修改值并不会影响到数组本身,而且 callback 函数的返回值也与数组本身无关。

解决办法有两种:

1.获取到数组的引用

let a = [1, 2, 3]
a.forEach((element, index, arr) => {
arr[index] = element + 1
})
console.log(a) // [2, 3, 4]

2.返回新的数组

let a = [1, 2, 3]
a = a.map(element => element + 1)
console.log(a) // [2, 3, 4]

参考:

文档信息

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
本文链接:www.snovey.com/2017/09/javascrpt-foreach.html