深度克隆實現

存儲狀態

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

  • 基本類型 基本類型由於數據大小固定存儲在棧之中java

  • 引用類型 引用類型由於數據大小不固定存儲在堆之中es6

深淺克隆

  • 基本類型克隆數組

    let a = 1;
    let b = a;
    b = 2;
    console.log(a); // 1
    console.log(b); // 2
    複製代碼

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

  • 引用類型克隆spa

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

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

  • 引用類型克隆方法對象

    方法一:遞歸

    1.判斷是否是原始值 2.判斷是數組仍是對象 3.新建數組或者對象ip

    按照這個過程遞歸

    // 對象的深度克隆方法封裝
    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);
    複製代碼
相關文章
相關標籤/搜索