JS forEach 是否改变原数组

11 min read

使用基本数据类型

const array = [1, 2, 3, 4];
array.forEach(ele => {
ele = ele * 3
})
console.log(array); // [1,2,3,4]

基本类型直接复制其值,不修改原数组

使用引用类型

const objArr = [{
    name: 'wxw',
    age: 22
}, {
    name: 'wxw2',
    age: 33
}]
objArr.forEach(ele => {
    if (ele.name === 'wxw2') {
        ele.age = 88
    }
})
console.log(objArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 88}]

引用类型复制其地址,地址不变,可以修改地址指向的内存地址的内容

改变整个单次循环的item

const changeItemArr = [{
    name: 'wxw',
    age: 22
}, {
    name: 'wxw2',
    age: 33
}]
changeItemArr.forEach(ele => {
    if (ele.name === 'wxw2') {
        ele = {
            name: 'change',
            age: 77
        }
    }
})
console.log(changeItemArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 33}]

这里也是复制了内存地址,但是赋值后,内存地址发生了变化,原数组就没有被

JavaScript是有基本数据类型引用数据类型之分的。

对于基本数据类型:number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值

而Object对象的真正的数据是保存在堆内存栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。

forEach 的基本原理也是for循环,使用arr[index]的形式赋值改变,无论什么就都可以改变了

可以认为forEach 将原数组进行一次浅拷贝,进行赋值操作都是针对这人拷贝的数据