深拷贝和浅拷贝
浅拷贝和深拷贝都是创建一份数据的拷贝。
JS 分为原始类型和引用类型,对于原始类型的拷贝,并没有深浅拷贝的区别,我们讨论的深浅拷贝都只针对引用类型。
- 浅拷贝和深拷贝都复制了值和地址,都是为了解决引用类型赋值后互相影响的问题。
- 但是
浅拷贝
只进行一层复制,深层次的引用类型还是共享内存地址,原对象和拷贝对象还是会互相影响。 深拷贝
就是无限层级拷贝,深拷贝后的原对象不会和拷贝对象互相影响。
手写深拷贝(核心为递归
)
function deepClone(obj={}){
//如果obj不为数组或对象,或者为空,则返回传入的值
if(typeof obj!=='obejct'||obj==null){
return obj
}
let result;
if(obj instanceof Array){
result=[]//将result变成数组格式
}else{
//否则就变为对象
result={}
}
for(let key in obj){
//进行递归,层层嵌套拷贝(如果没有这层递归,直接result[key]=obj[key]就是浅拷贝了)
if(obj.hasOwnProperty(key)){//指示对象自身属性中是否具有指定的属性
result[key]=deepClone(obj[key])
}
}
return result
}