数据类型:
简单数据类型
- 直接存储在栈中
复杂数据类型
- 指针在栈中,真实的数据存储在堆中(复杂数据类型首先会寻找存在栈中的指针对象,再而找到该指针指向的堆中数据)
深拷贝和浅拷贝只影响复杂数据类型 Object Array
浅拷贝:赋值指针,但是指针同时指向堆中相同的地址,所有会改变原来的数据
比如有一个保险柜里面有两万块钱(堆中的数据),只有A有钥匙(栈中的指针),但是A和B关系很好,A又配了一把钥匙(栈中的指针),A和B都有开启保险柜的钥匙(指针对象),B拿走了一万块钱(修改了堆中的数据),A再去看的时候就只有一万块钱了(看到了变化后的数据),这就是浅拷贝。
//浅拷贝
let arr =[{
name:'苹果',
price:18
},{
name:'香蕉',
price:17
},{
name:'石榴',
price:16
},{
name:'核桃',
price:15
},{
name:'橘子',
price:14
}]
let arr2 = arr; //赋值
//arr数组的第二项price会变成18
arr2[1].price = 18;
console.log(arr,'arr')
深拷贝:直接将堆中的数据重新拷贝了一份,放到了一个新的地址空间,互不影响。
A在银行存了两万块钱(堆中的数据),有一把属于自己的钥匙(栈中的指针),B按照A的流程自己也在银行存了两万块钱(堆中的数据),拥有自己的钥匙(栈中的指针),钥匙不同,保险柜不同,这就是深拷贝。
//深拷贝
let arr =[{
name:'苹果',
price:18
},{
name:'香蕉',
price:17
},{
name:'石榴',
price:16
},{
name:'核桃',
price:15
},{
name:'橘子',
price:14
}]
let arr3 = JSON.parse(JSON.stringify(arr)) //转成字符串 再转成数组对象
arr3[1]['price'] = 666
console.log(arr,'arr') //原数组对象不改变
console.log(arr3,'arr3') //深拷贝出来的对象改变