深拷贝与浅拷贝的区别
浅拷贝是指只复制一层对象,当对象的属性是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化
案例
var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
//当一个对象属性的引用值改变时将导致另一个也改变
shallowObj.arr[1] = 5;
obj.arr[1] // = 5
深拷贝是指复制对象的所有层级,实现方法
deepCopy(o) {
if (o instanceof Array) {
let n = [];
for (let i = 0; i < o.length; ++i) {
n[i] =deepCopy(o[i]);
}
return n;
} else if (o instanceof Object) {
let n = {}
for (let i in o) {
n[i] = deepCopy(o[i]);
}
return n;
} else {
return o;
}
}
为什么要使用深拷贝?
我们希望在改变新的数组(对象)的时候,不改变原数组(对象)
深拷贝的要求程度
我们在使用深拷贝的时候,一定要弄清楚我们对深拷贝的要求程度:是仅“深”拷贝第一层级的对象属性或数组元素,还是递归拷贝所有层级的对象属性和数组元素?
怎么检验深拷贝成功
改变任意一个新对象/数组中的属性/元素, 都不改变原对象/数组