JavaScript中使用forEach会改变原数组吗?

答:如果数组中的值是基本类型, 改变不了;如果是引用类型分两种情况:1、没有修改形参元素的地址值, 只是修改形参元素内部的某些属性,会改变原数组;2、直接修改整个元素对象时,无法改变原数组;

        JavaScript是有基本数据类型与引用数据类型之分的。对于基本数据类型:number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值。而Object对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。

一.数组中的值是基本类型

数组包含的是基本数据类型a,那么在在使用forEach时候,形参b会在栈中拷贝一份原数组的指针与值,此时a与b是完全独立的数据,我们在修改b的值时是不会影响到a的值。

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

二.数组中的值是引用类型

数组包含的是引用数据类型a,那么在使用forEach的时候,形参b拷贝的是引用数据类型在栈中的地址,此时a和b都同时指向在一开始定义a时在堆中保存的数据,所以当我们修改b的数据,a的值也会改变,因为他们都是指向的堆中的同一数据。
(基本数据类型:栈中保存指针与值;引用数据类型:栈中保存指针,堆中保存值)

1、数组的元素是引用数据类型:(直接修改整个元素对象时,无法改变原数组)

let array = [
    { name: '张三', age: 10 },
    { name: '李四', age: 20 },
];
 
array.forEach((item) => {
    item = {
        name: '王五',
        age: '29',
    };
});
console.log(array ); 
 
// 打印结果:[{"name": "张三","age": 10},{"name": "李四","age": 10}]

2、数组的元素是引用数据类型:(修改元素对象里的某个属性时,可以改变原数组)

let arr= [
    { name: '张三', age: 10 },
    { name: '李四', age: 20 },
];
 
arr.forEach((item) => {
    item.name = '王五';
});
console.log(arr);
// 打印结果:[{"name":"王五","age":18},{"name":"王五","age":20}]

如何改变原数组中基本类型的值: 


可以借助第二个参数index来改变数组

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

猜你喜欢

转载自blog.csdn.net/qq_21473443/article/details/131759713
今日推荐