對(duì)象的拷貝(clone)(深拷貝和淺拷貝)

  • 什么是對(duì)象的拷貝?
    將一個(gè)對(duì)象賦值給另外一個(gè)對(duì)象, 我們稱之為對(duì)象的拷貝

  • 什么是深拷貝, 什么是淺拷貝?
    例如:將A對(duì)象賦值給B對(duì)象

  • 淺拷貝是指, 修改B對(duì)象的屬性和方法會(huì)影響到A對(duì)象的屬性和方法, 我們稱之為淺拷貝

        function Person(name, age, dog) {
         this.name = name;
         this.age = age;
         this.say = function () {
             console.log(this.name, this.age);
         };
         this.dog = dog;
     }
     var p1 = new Person("luodou", 13, {
         name: "wc",
         age: "3"
     });
    
     // 1.對(duì)象之間的直接賦值
     /*
     // 將p1對(duì)象賦值給p2對(duì)象
     // 本質(zhì)上是p1和p2都指向了同一塊存儲(chǔ)空間
     // 所以無(wú)論是修改p1還是p2都會(huì)影響到另外一個(gè)
     // 所以下列代碼是淺拷貝
     var p2 = p1;
     console.log(p1.name);
     p2.name = "zq";
     console.log(p1.name);
     */
    
     // 2.對(duì)象屬性的逐一賦值
     var p2 = new Person();
    
     copy(p1, p2);
     function copy(o1, o2){
         for(var key in o1){
             o2[key] = o1[key];
         }
     }
    
     console.log(p2);
    
     console.log(p1.dog.name);  //wc
     p1.dog.name = "mm";
     console.log(p1.dog.name);  //mm
    
  • 深拷貝是指, 修改B對(duì)象的屬性和方法不會(huì)影響到A對(duì)象的屬性和方法, 我們稱之為深拷貝

    function Person(name, age, dog) {
        this.name = name;
        this.age = age;
        this.say = function () {
            console.log(this.name, this.age);
        };
        this.dog = dog;
    }
    // var p1 = new Person("lnj", 13, {
    //     name: "wc",
    //     age: "3"
    // });
    var p1 = new Person("lnj", 13,{
        name: "wc",
        age: "3"
    });
    /*
    //若傳入的是數(shù)組也一樣,數(shù)組也是對(duì)象
      var p1 = new Person("lnj", 13,[1,3,5]);
     */
    var p2 = new Person();

    function deepCopy(o1, o2){
        // 取出第一個(gè)對(duì)象的每一個(gè)屬性
        for(var key in o1){
            // 取出第一個(gè)對(duì)象當(dāng)前屬性對(duì)應(yīng)的值
            var item = o1[key]; // dog
            // 判斷當(dāng)前的值是否是引用類型
            // 如果是引用類型, 我們就重新開(kāi)辟一塊存儲(chǔ)空間
            if(item instanceof Object){
                var temp = new Object();
                /*
                {name: "wc",age: "3"}
                 */
               deepCopy(item, temp);   //遞歸
                o2[key] = temp;
            }else{
                // 基本數(shù)據(jù)類型
                o2[key] = o1[key];
            }
        }
    }

    deepCopy(p1, p2);
    console.log(p1.dog.name); // wc
    p2.dog.name = "mm";
    console.log(p1.dog.name); // wc

    /*
    deepCopy(p1, p2);
    console.log(p1.dog); // wc
    p2.dog = [2,4,6];
    console.log(p2);
    console.log(p1.dog); // wc
     */
  • 注意點(diǎn):
    • 默認(rèn)情況下對(duì)象之間的直接賦值都是淺拷貝

    • 默認(rèn)情況下一個(gè)對(duì)象的屬性如果是基本數(shù)據(jù)類型, 那么都是深拷貝

    • 如果對(duì)象的屬性包含了引用數(shù)據(jù)類型, 才真正的區(qū)分深拷貝和淺拷貝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容