Array数组的一些发现

今天对一些元素都是纯数字的数组做forEach遍历操作,发现无法改变原数组,查找了一些资料发现,forEach只能处理数组中的引用类型,元素为基础类型的需要另外的写法。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let arr = [1, 2, 3, 4, 5]
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [{a:1,b:2}]

// 元素为基础类型number,原数组不变
arr.forEach(item => {
item += 1
})

// 这种写法可行
arr1.forEach((item, index) => {
arr1[index] += 1
})

// 元素为引用类型的,原数组会改变
arr2.forEach(item=>{
item.a = 66
})
console.log(arr);
console.log(arr1);
console.log(arr2);

这主要是和计算机的堆栈有关。基础类型是存储在栈中,forEach中得到item也是存储于栈中,所以它就和数组中的元素毫无关系了;而对象是存储于堆中,遍历的时候item虽然在栈中但是它的指针会指向堆中的位置,所以可以直接修改原数组。


Array数组的一些发现
https://zouhualu.github.io/20211020/Array数组的一些发现/
作者
花鹿
发布于
2021年10月20日
许可协议