淺拷貝與深拷貝

一、淺拷貝只拷貝一層,更深層次對象級別的只拷貝引用;所以改變新對象的屬性值時,改變原對象。
    Object.assign(target,...sources) 是es6新增方法進行淺拷貝;
二、深拷貝拷貝多層每一級別的數據都會拷貝;所以改變新對象的屬性值時,不會改變原對象。
    簡便方法:JSON.parse(JSON.stringify(obj))

使用JavaScript實現淺拷貝和深拷貝:

被拷貝對象:obj,拷貝對象:o,即:拷貝obj對象,使對象o具備obj對象的屬性名與屬性值。

一個小知識點:在改變對象 o 的一個屬性前 console.log() 輸出對象o,發現輸出的對象 o 是改變後的值。因爲 console.log()輸出 對象時,點擊控制檯的小倒三角 會獲取該對象的最新狀態。—— 對比:在對象屬性值改變前console.log()輸出該對象將改變的值仍然是以前的值。(具體參考第一條淺拷貝的代碼及輸出圖)

1、淺拷貝

1)使用循環對象進行拷貝

//淺拷貝
    var obj={
        id:1,
        name:'lee',
        msg:{
            age:18
        },
        color:['red','blue']
    }
    var o={};

    console.log('——————————一般淺拷貝——————————')
    for(var k in obj){// k:屬性名 , obj[k]:屬性值
        o[k]=obj[k];
    }
    console.log(o)//點擊三角後獲取最新數據
    console.log(o.msg.age);
    o.msg.age=20;
    console.log(obj);

輸出:

2)使用ES6新增方法 assign() 進行拷貝

//淺拷貝
    var obj={
        id:1,
        name:'lee',
        msg:{
            age:18
        },
        color:['red','blue']
    }
    var o={};

    console.log('——————————ES6新增淺拷貝方法——————————')
    Object.assign(o,obj);
    console.log(o)
    o.msg.age=20;
    console.log(obj);

輸出:

2、深拷貝

使用了遞歸函數實現深拷貝。

注意:先判斷屬性值是否屬於數組類型,再判斷是否屬於對象類型,因爲Array也屬於Object。

    var obj={
        id:1,
        name:'lee',
        msg:{
            age:18
        },
        color:['red','blue']
    }
    var o={};

    //深拷貝
    console.log('——————————深拷貝——————————')
    //封裝函數
    function deepCopy(newobj,oldobj){
        for(var k in oldobj){
            //判斷屬性值是什麼數據類型
            //獲取屬性值 oldobj[k]
            var item=oldobj[k];
            
            if(item instanceof Array){
                //判斷是否是數組(先判斷,因爲數組也屬於Object)
                newobj[k]=[];
                deepCopy(newobj[k],item);
            }else if(item instanceof Object){
                //判斷是否是對象
                newobj[k]={};
                deepCopy(newobj[k],item);
            }else{
                //簡單數據類型
                newobj[k]=item;
            }
        }
    }
    deepCopy(o,obj);
    console.log(o);
    o.msg.age=20;
    console.log(obj);

輸出:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章