深淺克隆實現

存儲狀態

存儲地址分爲堆、棧這兩種

  • 基本類型
    基本類型因爲數據大小固定存儲在棧之中

  • 引用類型
    引用類型因爲數據大小不固定存儲在堆之中

深淺克隆

  • 基本類型克隆

    let a = 1;
    let b = a;
    b = 2;
    console.log(a); // 1
    console.log(b); // 2
    

    基本類型存入棧之中克隆後不會影響到被克隆對象

  • 引用類型克隆

    let arr = [1,2];
    let arr1 = arr;
    arr1.length = 1;
    console.log(arr); // [1]
    console.log(arr1); // [1]
    

    引用類型存入堆之中克隆後他們所指向的地址相同所以對於他們的克隆不能直接賦值

  • 引用類型克隆方法

    方法一:

    1.判斷是不是原始值
    2.判斷是數組還是對象
    3.新建數組或者對象

    按照這個過程遞歸

    // 對象的深度克隆方法封裝
    function deepClone(orgin, target) {
        let target = target || {}, // 有的話就用這個參數沒有新建一個
        arrStr = "[object Array]"; // 這裏用於判斷屬性類型
            for(let prop in orgin) {
                // 這一步防止克隆了原型鏈上的東西
                if(orgin.hasOwnProperty(prop)){
                    if(typeof(orgin[prop]) == 'object'){
                        if(orgin[prop].toString() == arrStr) {
                            target[prop] = [];
                        }else{
                            target[prop] = {};
                        }
                    }
                    deepClone(orgin[prop], target[prop]);
                }else{
                    target[prop] = orgin[prop];
                }
            }
        return target;
    }  
    

    方法二:

    es6新增的assign方法

    let obj = {
        name: '司塵';
        age: '1';
    }
    let obj1 = Object.assign({}, obj);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章