[学习笔记] JS深拷贝
//深拷贝函数的参数是一个对象 obj{}
function deepCopy(obj) {
// 1. 判断 obj 是否为对象或者是否为空
if(typeof obj !== 'object' || typeof obj == null){
return obj
}
let result
// 2.这里用 instanceof 来决定result的类型
if(obj instanceof Array)
result = [] //数组
else
result = {} //对象
for(let prop in obj){
//这里用于确保prop是否是原型的属性
if(obj.hasOwnProperty[prop]){
// 3.关键一步: 递归
result[prop] = deepCopy(obj[prop])
}
}
return result
}
const obj1 = {
name: 'Lee J',
age: 26,
city: {
name: 'BeiJing',
zip: '111111'
}
}
//Case 1:
//引用类型的拷贝规则是浅拷贝
// 这里 obj2 = obj1 只是单纯的浅拷贝, obj2指向的其实还是obj1的地址,
//即若改变obj2里的属性值,obj1也会跟着改变
let obj2 = obj1
console.log(obj1.name) //print 'Lee J'
obj2.name = 'Mike L'
console.log(obj2.name) //print 'Mike L'
console.log(obj1.name) //print 'Mike L '
//Case 2:
//深拷贝结果
obj1.name = 'Lee J' //复原obj1.name 的值
let obj3 = deepCopy(obj1) //深拷贝返回result到obj3
console.log(obj1.name) //print 'Lee J'
obj3.name = 'Mike L'
console.log(obj3.name) //print 'Mike L'
console.log(obj1.name) //print 'Lee J
总结:
深拷贝和浅拷贝区别在于深拷贝是在 Heap中 new 一个新的地址并让拷贝对象指向这个新的地址
而浅拷贝则是 拷贝对象和被拷贝对象同时指向同一个地址,造成修改拷贝对象时,被拷贝对象也会被修改