浅拷贝:
浅拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或方法,都可以使用。
浅拷贝:仅仅复制对象的引用,而不是对象本身。
var obj1={
name: "Tom",
age: 25,
sex: "男",
car:["奔驰","宝马","奥迪"]
}
var obj2={};
//函数:浅拷贝,把一个对象中的所有属性复制到另一个对象中
//把a对象中的所有属性复制到b对象中
function shallowCopy(a,b){
for(var key in a){
b[key] = a[key];
}
}
shallowCopy(obj1,obj2);
obj2.name = "Jack";
obj2.car[0] = "北京现代";
console.dir(obj1);
console.dir(obj2);
输出结果:
上面可以看出,浅拷贝,改变obj2对象中单层属性name的值,obj1对象中单层属性name的值不会被改变,但是改变obj2对象中car的值,obj1对象中car的值也相应的被改变了。
深拷贝:
深拷贝也是复制,但是,深:就是把一个对象中所有的属性或方法,一个一个的找到,并且在另一个对象中开辟相应的空间,一个一个的存储到另一个对象中。
深拷贝:复制对象所引用的全部对象。
var obj1={
name: "Tom",
age: 25,
sex: "男",
car:["奔驰","宝马","奥迪"],
dog:{
name: "大黄",
age: 5,
color: "黄色"
}
}
var obj2={};
//函数:深拷贝,把一个对象中的所有属性深拷贝到另一个对象中
//把a对象中的所有属性深拷贝到b对象中
function deepCopy(a,b){
for(var key in a){
//先获取a对象中每个属性的值
var item = a[key];
//分情况拷贝
if(item instanceof Array){
//判断这个属性的值是不是数组
//如果是数组,那么在b对象中添加一个新的属性,是一个空数组
b[key] = [];
//再调用这个方法,把a对象这个数组属性的值,一个个复制到b对象的这个数值属性中去
deepCopy(item,b[key]);
}else if(item instanceof Object){
//判断这个属性的值是不是对象
//如果是对象,那么在b对象中添加一个新的属性,是一个空对象
b[key] = {};
//再调用这个方法,把a对象中的这个对象属性的值,一个个复制到b对象中的这个对象属性中去
deepCopy(item,b[key]);
}else{
//如果值是普通数据,直接复制到b对象的这个属性中
b[key] = item;
}
}
}
deepCopy(obj1,obj2);
obj2.name = "Jack";
obj2.car[0] = "北京现代";
obj2.dog.name = "豆豆";
console.dir(obj1);
console.dir(obj2);
输出结果:
从上面可以看到,深拷贝可以解决浅拷贝中的问题。