淺拷貝和深拷貝

掙錢去植髮發表於2020-11-02

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()

相關文章