深拷贝与浅拷贝
引用类型的问题
浅拷贝
:(对于引用类型只拷贝了在堆内存的地址,共享同一块内存空间,会相互影响)
是指创建新的数据,将源对象的属性拷贝一份。如果属性是基本类型,拷贝的是基本类型的值;如果为引用类型,拷贝的是内存地址。修改对象属性会影响原对象。深拷贝
:(对于引用类型的拷贝开辟新的内存空间,拷贝对应数据,对应两个不同地址,相互不影响)
,是开辟了一个新的栈,两个对象属性相同。将拷贝过程中遇到的引用类型都新开辟一块地址拷贝对应的数据,对应两个不同的地址,避免子对象共享同一份内存的问题了,修改一个不会影响另一个
深拷贝实现
let B = {
a:1,
b:[1,2,3],
c:function(){
console.log("hello")
},
d:null,
e:/^[0-9]/,
f:{
g:[1,2,4],
h:1
}
}
// 解构赋值 无法处理多维,浅拷贝。
// JSON对象方法 无法拷贝函数 null 正则
// let A = JSON.parse(JSON.stringify(B))
function deepClone(Obj){
// 引用类型 => 数组 或者 对象
//返回一个结果
let resultObj = Obj.constructor === Array ? [] : {}
// 遍历key
for (let key in Obj){
// for in 会遍历整个原型链 加判断
if(Obj.hasOwnProperty(key)){
// 对引用类型做处理 不走正则
if(typeof Obj[key] === 'object' && Obj[key] !== null && !Obj[key] instanceof RegExp){
// 递归
resultObj[key] = deepClone(Obj[key])
}else{
// 直接赋值
resultObj[key] = Obj[key]
}
}
}
return resultObj
}
let A = deepClone(B)
A.f.h = 3333
A.b.push(1)
A.e = /^[0-9]$/
A.d = false
console.log(A,B)