一句话概括:
浅拷贝: 假设B复制了A,当修改B里面的值时,A也改变了 那就是浅拷贝
深拷贝: 与上面相反,A的值没有改变那就是深拷贝
举个例子:
明明复制了一份 但看到原来那个也跟着变了
这里就要引出 基本数据类型 与 复杂数据类型 的概念了.
基本类型: Number String Boolean undefined null bigint symbol
复杂类型: 对象(Object)、数组(Array)、函数(Function) ------>都是object
1.基本数据类型的值是存在栈中的
例: let a = 1
当把a复制一份给b时 其实是这样
会直接在内存中开辟新空间
2.复杂数据类型的值存在堆中
栈中会提供一个引用地址来指向堆中的值
当obj2 = obj 进行复制时 其实复制的是地址引用,所以当 obj2.a = 3 时
理所当然,两个obj的值都改了, 要想避免这种情况就要用到深拷贝了
实现深拷贝的2种方法
1. lodash包提供的cloneDeep ()方法
现在我们把 a改成 The witcher 3
原来的那个对象并没有改变
注:用const声明的复杂类型可以改变
2.用递归
<script>
function deepClone(obj){
// 判断传进来的是数组还是对象
let objClone = Array.isArray(obj)?[]:{};
// 判断是否有obj 且类型是否为object 数组是特殊object
// typeof的优先级比 === 高
if(obj && typeof obj==="object"){
for(key in obj){
//判断obj子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,直接复制
objClone[key] = obj[key];
}
}
}
return objClone;
}
let game = {
a:'cyberPunk 2077',
b: 'Dying light 2',
c: 'God of War'
}
let games = deepClone(game)
console.log(game);
console.log(games);
</script>
同样再来修改a
深拷贝,就是拷贝对象各个层级的属性,方法还有许多, 这里就不介绍了.