浅复制
举个复制代码的例子:
function clone(p,s) {
var s = s || {};
for (var prop in p) {
s[prop] = p[prop];
}
return s;
}
var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1] // 'reading'
c.hobby[1] // 'reading'
由上面的例子可以看出,当执行浅复制时,如果对象里包含子对象,当我们对b对象进行修改时c对象也会受到影响,这是因为浅复制是复制引用,复制后的引用都是指向同一个对象的实例,因此彼此之间的操作会互相影响
深复制
现在我们来对浅复制的代码进行一下小小改动,实现深复制:
function deepClone(p,s) {
var s = s || {};
for (var prop in p) {
if (typeof p[prop] == 'object') {
s[prop] = (p[prop].constructor === Array)?[]:{};
deepClone(p[prop],s[prop]);
} else{
s[prop] = p[prop];
}
}
return s;
}
var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1] // 'reading'
c.hobby[1] // 'running'
由上例子可知,深复制可以解决浅复制的弊端,对于b对象进行修改时c对象也不会受到影响,这是因为深复制不是简单的复制引用,而是在堆中重新分配内存,并且把源对象实例的所有属性都进行新建复制,以保证深复制的对象的引用图不包含任何原有对象或对象图上的任何对象,复制后的对象与原来的对象是完全隔离的。由深复制的定义来看,深复制要求如果源对象存在对象属性,那么需要进行递归复制,从而保证复制的对象与源对象完全隔离。