深拷贝与浅拷贝
1.浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
2. 深拷贝:复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变;
实现深拷贝一般有两种方式:
(1)递归
(2)JSON.stringify结合JSON.parse的方式
浅拷贝 指向的都是一个地址(只是将地址指向同一个,而不是真正意 义上的拷贝)
const a = [0,1,2,3,4]
const b = a
a[0] = 1
console.log(a,b);
//结果:
//a:1,1,2,3,4,5
//b:1,1,2,3,4,5
//浅拷贝:b复制了a,改变b,a也会随着改变。(a与b指向的是同一个地址,所以b也受了影响)
深拷贝 递归方式
function deepClone(obj) {
//Array.isArray() 用于确定传递的值是否是一个 Array
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for (key in obj) {
//判断ojb子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone[obj[key]]
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
return objClone;
}
let _obj = {0:'小明',1:'小红',2:'小鹿'},
_obj2 = deepClone(_obj);
_obj[0] = "张飞"
console.log(_obj,_obj2);
//结果:
//_obj:{0: "张飞", 1: "小红", 2: "小鹿"}
//_obj2:{0: "小明", 1: "小红", 2: "小鹿"}
//深拷贝:_obj2复制了_obj,改变_obj,不会改变_obj2(开辟一个新的内存空间,修改新对象,旧对象保持不变)
深拷贝 JSON.stringify结合JSON.parse的方式
function deepClone(obj) {
const _obj = JSON.parse(JSON.stringify(obj))
return _obj
}
let a = [0,1,2,3,4]
b = deepClone(a)
a[0] = 1
console.log(a,b);
//结果:
//a:1,1,2,3,4,5
//b:0,1,2,3,4,5
//深拷贝:b复制了a,改变a,不会改变b(开辟一个新的内存空间,修改新对象,旧对象保持不变)