浅拷贝和深拷贝

1.浅拷贝

通过循环,将a对象的属性和方法拷贝给b属性,但是由于拷贝时a对象内部的引用数据类型时,其值为堆里该引用数据类型的地址值,所以会造成a、b两个对象中的引用数据类型指向堆中同一块内存地址,这会造成牵一发而动全身,改动a的引用数据类型会导致b中的该值也受到牵连。

var a = {
      name:"objectaaaaa",
      go:function(){
        console.log("这是对象a的方法")
      },
      another:{
        name:"不知道"
      },
      have:[1,2,5,6] 
    }

    var b = {}
    for(var key in a){
      b[key] = a[key]
    }
    a.name = "wwwwqq"
    a.another.name = "hahah"
    console.log("a",a)
    console.log("b",b)

2、深拷贝

通过递归的方式对对象的引用数据类型当作一个新的对象再进行浅拷贝再赋值,这样就可以确保二者的地址值指向堆中地址不一样。

var a = {
      name:"objectaaaaa",
      go:function(){
        console.log("这是对象a的方法")
      },
      another:{
        name:"不知道"
      },
      have:[1,2,5,6] 
    }

    var b = {}
    // for(var key in a){
    //   b[key] = a[key]
    // }

    function deepCopy(a,b){
      for(var key in a){
        if(a[key] instanceof Array){
          b[key] = []
          deepCopy(a[key],b[key])
        }else if(a[key] instanceof Object){
          if(a[key] instanceof Function){
            b[key] = a[key]
          }else{
            b[key] = {}
            deepCopy(a[key],b[key])
          }
        }else{
          b[key] = a[key]
        }
      }
    }
    deepCopy(a,b)
    a.name = "wwwwqq"
    a.another.name = "hahah"
    console.log("a",a)
    console.log("b",b)
    b.go = function(){
      console.log("this is b")
    }
    b.go()
    a.go()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值