JS中有两个大的数据类型分类,一个是基础数据类型,一个是引用数据类型。对于基础数据类型,其值的存储是在栈内存中的,一个key对应一个value。而对于引用数据类型,其值是存在堆内存中的,但是其键值是存放在栈内存中的,栈内存中的key对应的value则是其值在内存中的地址,这也是为什么当你直接将一个引用类型的数据赋值给另一个变量后,修改这个被赋值变量的value,会影响原本变量中的value,因为二者修改的value都是同一个内存地址下的value。这种就是浅拷贝,而要想二者互不冲突,就需要在内存中开辟一个新的空间存储,这就是深拷贝。
实现深拷贝最为常见的方法就是使用递归的方法:
function deepClone(obj) {
// 判断传入obj是数组还是对象
let objClone = Array.isArray(obj)?[]:{};
if(typeof obj === 'object' && obj) {
for(key in obj) {
// 判断该属性是否为这个对象本身的属性
if(obj.hasOwnProperty(key)) {
// 判断是否为复杂属性
if(typeof obj[key] === 'object' && obj[key]) {
objClone[key] = deepClone(obj[key]);
}else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}