深拷贝和浅拷贝
浅拷贝:只复制一层,例如赋值,改变a的同时也会引起b的变化
深拷贝:复制多层,改变a不会引起b的变化
eg:
浅拷贝:
let a={x:1,y:2,z:{o:3}}
let b=a
a.z.o='k6'
console.log(b.z.o)//k6
深拷贝:
let a={x:1,y:2,z:{o:3}}
let b=JSON.parse(JSON.stringify(a))
a.z.o='k6'
console.log(b.z.o)//3
JSON.stringify实现深拷贝的弊端:
1.如果对象下面存在时间对象的话,时间只能是字符串形式,而不是对象形式,
2.如果对象下面存在函数,undefined的话,不能实现深拷贝
等
递归实现深拷贝
function deepClone(source){
//1.先判断source是不是对象,不是的话直接return
if(!source && typeof source !=='object) return
//2.声明一个新对象
let targetObj= source.constructor ==Array?[] :{}
//3.遍历key
Object.keys(source).forEach(key=>{
if(source[key] && typeof source[key] =='object' ){
targetObj[key]=deepClone(source[key])
}else{
targetObj[key]=source[key]
}
})
//4.返回
return targetObj
}