什么是深拷贝、浅拷贝?

深拷贝与浅拷贝

赋值

  • 把一个对象的地址赋值给另一个变量
  • 两个变量操作同一个空间
var o1={
	name:'jack'
}
var o2=o1;
o2.name='rose'
console.log(o1,o2);//这是赋值和拷贝没有关系

浅拷贝

  • 把对象里面的每一个成员,复制一份一模一样的内容,放到另一个对象里面
  • 当对象里有一个对象成员是复杂数据类型时,这个成员依旧是一样的
  • 浅拷贝只是操作对象里面的一层可以没有关系,如果再深层次就会出现问题了
var o1={
            name:'jack',
            age:18,
            //o1.onfo存储的是一个地址
           //浅拷贝:当对象里有一个对象成员是复杂数据类型时,这个成员依旧是一样的
            info:{
                a:1,
                b:2
            }

        }
     var o2={};

    for(var i in o1){
    //将o1里的成员赋值过去的时候,其实是将的o1.info存储的地址赋值给了o2.info

      o2[i]=o1[i]
    }
    //o1和o2是两个对象空间,但是里面的内容是一样的
		console.log(o1,o2)
 

		o2.name='jiayou'
		o2.info.a='new Value';  //o.info和o2.info操作的是一个内存空间
    //o1和o2没有关系,操作其中一个,另一个不受影响
		console.log(o1,o2);

 var o1={
            name:'jack',
            age:18,
            info:{
                a:1,
                b:2
            }
        }
        
      let o2={...o1}
      o2.age=66;   //第一层深拷贝
      o2.info.a='哈哈哈';  //第二层没有实现深拷贝
      console.log(o1,o2) 

 var a=[1,2,[3,4]]
 var c=[];
 var b=c.concat(a);
 b[0]=5;
 b[2][0]=6;
 console.log(b[0]);        //5
 console.log(a[0])        //1
 console.log(b[2][0]);   //6
 console.log(a[2][0])    //6

深拷贝

  • 对象空间里面不管有多少层,都是相对独立的,没有关系
  • 深拷贝的实现方式1:
    • 使用for in遍历赋值:
      • 只要碰到某一个是复杂数据类型 对象或数组,再次进入到这个数据类型里面进行二次遍历,如果还有就在进入遍历。(太麻烦,不推荐)
  • 深拷贝实现方式2:
    • 使用json:
      • 不管多复杂的数据类型,转换为json以后就是字符串了,字符串的赋值是基本数据类型,赋值以后再转换回来
      • 【注意】Json的方式实现深拷贝是有局限性的,函数在专为json字符串时是会被忽略
var o1={
  name:'jack',
  age:18,
  info:{
    a:1,
    b:2
  }
}
var obj=JSON.stringify(o1);
var o2=JSON.parse(obj);

o2.info.a=88; //此时操作o2,o1就不再受影响了
console.log(o1,o2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值