什么是深拷贝?
- 讨论这个话题前应先了解什么是浅拷贝,点此什么是浅拷贝传送
拷贝时将数据中的所有引用结构都拷贝一份,使得两份数据在内存中完全独立,两者之间进行任何数据修改都不会影响彼此,那就是深拷贝
var deepCopy = function() {
var temp = {};
for(var k in this) {
if(typeof this[k] === 'object') {
temp[k] = this[k].deepCopy;//让每个对象都有deepCopy方法,它们指向的是同一个方法
} else {
temp[k] = this[k];
}
}
return temp;
};
var car = {
name: "奇瑞qq"
};
var student = {
name: "小陈",
age: 18,
sex: "男",
car: car
};
//通过js对象的动态特性让每个对象都deepCopy方法,并且它们指向同一个方法体
car.deepCopy = deepCopy;
student.deepCopy = deepCopy;
//让每个对象都执行deepCopy方法,如此反复就形成深拷贝
var p = student.deepCopy();
p.car = student.car.deepCopy();
console.log(p.car==student.car);//false,证明两者是不同对象的引用
此代码最精髓的地方是deepCopy函数是循环引用和调用
代码流程图
从图中能看出对象p和student在内存中完全独立,两者互不相扰,唯一存在瓜葛的是我们为了实现深拷贝而自定义的函数deepCopy,但这并不影响它们在这实现了深拷贝