深拷贝
- 深拷贝:在堆中重新分配内存,不同的地址,相同的值,互不影响
- JSON.parse()和JSON.stringify()
- JSON.stringify():把一个js对象序列化为一个JSON字符串
- JSON.parse():把JSON字符串反序列化为一个js对象
let obj = {
name: '张三',
age: 20,
chi: [{ name: '李四' }]
}
let obj2 = JSON.parse(JSON.stringify(obj))
obj2.name = '王五'
obj2.chi[0].name = '李六'
console.log(obj)
console.log(obj2)
- 测试JSON.parse()和JSON.stringify()也是深拷贝,但是undefined和function会被忽略
- 利用递归来实现对对象或数组的深拷贝。递归思路:对属性中所有引用类型的值进行遍历,直到是基本类型值为止
function deepCopy(obj) {
if (!obj && typeof obj !== 'object') return
const targetObj = Array.isArray(obj) ? [] : {}
for (let key in obj) {
//只对对象自有属性进行拷贝
if (obj.hasOwnProperty(key)) {
//该对象的typeof等于object时递归赋值
if (obj[key] && typeof obj[key] === 'object') {
targetObj[key] = this.deepCopy(obj[key]) || deepCopy(obj[key])
} else {
targetObj[key] = obj[key]
}
}
}
return targetObj
}
浅拷贝
- 浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响
let a = [1, 2, 3, 4];
let b = a.slice();
console.log(a === b); // false
a[0] = 5;
console.log(a); // [5, 2, 3, 4]
console.log(b); // [1, 2, 3, 4]
let a = [1, 2, 3, 4];
let b = a.concat();
console.log(a === b); // false
a[0] = 5;
console.log(a); // [5, 2, 3, 4]
console.log(b); // [1, 2, 3, 4]