js高级之浅拷贝和深拷贝的理解
对象的拷贝分为浅拷贝和深拷贝
1、浅拷贝
案例:var obj1 = {
name: "zs",
age: 20,
sex: "男",
dog: {
name: "金毛",
age: 2,
yanse: "yellow",
},
}
var obj2 = {}; //注意:此时obj2的地址和obj1的地址不一样。
copy(obj1, obj2);
//console.dir(obj2);//此时也将dog属性及所有的成员也复制过来了,
//那此时修改一下obj1的成员,是否会影响obj2呢?
obj1.name="xxx";
obj1.dog.name="大黄";
console.dir(obj1);
console.dir(obj2); //此时obj2的成员受影响,但obj2的dog的成员受影响了,为什么?
//因为obj1下的成员是简单(基本)数据类,存储在栈上,但dog成员是一个对象,
//在内存空间中会开辟一个空间,此时obj1和obj2的dog的地址都对应一个空间地址,
//所以当obj1中的dog的成员被修改了之后,obj2中的dog也被修改了
★上面的拷贝就是浅拷贝,浅拷贝就是当一个对象拷贝给另一个对象时,
只把第一层数据拷贝过去了,复杂类型的成员知识把地址拷贝了过去★2、深拷贝
案例:var obj1 = {
name : "zs",
age : 18,
sex : "男",
dog : {
name : "金毛",
age : 2,
},
friends: [ "ls","ww" ]
}
//深拷贝,把o1的成员拷贝给o2
function deepCopy(o1,o2){
for(var key in o1){
//获取key属性对应的值
var item = o1[key];
//如果item是对象?进行判断
if(item instanceof Object){
//如果是对象,
//则o2对象中创建一个对象来接收这个对象的成员
o2[key] = { };//新创对象来接收
deepCopy(item, o2[key]); //利用递归
//如果item是数组?进行判断
}else if (item instanceof Array){
//如果是数组,
//则o2对象中创建一个数组来接收这个数组的成员
o2[key] = [ ]; //新创数组来接收,否则接收的是undefined的数组
deepCopy(item, o2[key]); //利用递归
//如果成员是简单类型,就直接浅拷贝
}else {
o2[key] = o1[key];
}
}
}
var obj2 = { }; //注意:此时obj2的地址和obj1的地址不一样。
deepCopy(obj1,obj2); //把obj1的成拷贝给obj2
//修改obj1中的成员,是否会影响obj2?
obj1.dog .name = "xxx";
obj1.friends[0]="007";
console.dir(obj1);//输出修改后的obj1的成员
console.dir(obj2);//输出obj1拷贝的原成员答案是没有改变值,因为对象间进行了深拷贝,深拷贝拷贝的是多层,故在堆里互不影响
js高级之浅拷贝和深拷贝的理解
最新推荐文章于 2022-03-28 11:43:13 发布