1. 网上有很多关于深拷贝和浅拷贝的理论,这里就不细讲了,下面说一下深拷贝实现方法
```
function deepCopy(data) {
var newdata = Array.isArray(data) ? [] : {}
if (data && typeof data === "object") {
for (var k in data) {
// 判断data的k子元素是不是对象。如果是递归,如果不是,直接复制
if (data.hasOwnProperty(k)) {
if (data[k] && typeof data[k] === "object") {
// 如果对象里面的属性还是对象则递归调用
newdata[k] = deepCopy(data[k]);
} else {
newdata[k] = data[k];
}
}
}
}
return newdata
}
```
var newdata = Array.isArray(data) ? [] : {}
newdata[k] = data[k];
实现深拷贝主要看这两行,可以看到deepCopy函数里面新建了一个变量newdata,然后做了类型判断,如果是数组类型则定义为空数组,如果不是,则定义为空对象类型。并且把data[k] 赋值给了newdata[k]。这里data,是指传参,是指要拷贝的对象,所以data[k]是指对象里面的具体属性,所以newdata[k]=data[k]就是把拷贝对象的每个属性都一一赋值给新变量newdata,然后最后再retrun newdata;
所以深拷贝的中心思想则是,把A对象直接赋值给B对象,因为对象共用一个栈,所以修改b会影响会产生浅拷贝影响,所以这时创建一个第三方变量C,把对象A的属性都一一赋值给C,然后C再赋值B,所以A 和B 没有直接关系了,这时B再去修改其属性值也不会对A造成影响了
示例:
网友评论