forEach()函数究竟会不会修改原数组?
# 先来看两个🌰:
例子一:
let arr = [1, 2, 3, 4]
arr.forEach(item => {
item += 1
})
console.log(arr); // [1, 2, 3, 4]
1
2
3
4
5
2
3
4
5
从例子一来看的话,forEach()
并不会修改原数组。那么我们再看一下例子二:
例子二:
let arr = [{
a: 'ww',
b: 'cc'
}, {
a: 'dd',
b: 'll'
}]
arr.forEach(item => {
item.a = 1
})
console.log(arr);
// a: 1 b: "cc"
// a: 1 b: "ll"
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
从例子二中我们看到,arr的a属性全被修改成了1。
js的数据有基本数据类型和引用数据类型,同时引出堆内存和栈内存的概念。对于基本数据类型:Number、String 、Boolean、Null和Undefined,它们在栈内存中直接存储变量名和值。而Object对象的真实数据存储在堆内存中,它在栈内存中存储的是变量名和堆内存的位置。 而在forEach方法里操作了obj对象,实际操作的是对象本身,而数据只是引用了对象的栈内存地址,所以数组里的数据相应改变。 那么为什么forEach方法不能改变数组里的基本变量呢?因为数组内的基本变量,在栈内存内生成了自己的值,并非引用栈内存的地址。
# 总结
数组元素如果为基本类型时,forEach()
无法改变原数组。
数组元素如果为引用类型时,forEach()
可以改变原数组。
在GitHub上编辑 (opens new window)
上次更新: 2/23/2022, 5:36:03 PM