手寫一個深拷貝


深拷貝

說到深拷貝,肯定想到的最簡單的方式就 JSON.stringify 和 JSON.parse 配合,這個是最簡單的深拷貝方式

手寫一個深拷貝

深拷貝 = 淺拷貝 + 遞歸 ,這個只是最笨的一種方式

var a = {
    name: "muyiy",
    book: {
        title: "You Don't Know JS",
        price: "45"
    },
    a1: undefined,
    a2: null,
    a3: 123
}
// hasOwnProperty表示是否有自己的屬性。這個方法會查找一個對象是否有某個屬性,但是不會去查找它的原型鏈。
function cloneDeep1(source) {
    var target = {};
    for (var key in source) {
        if (source.hasOwnProperty(key)) {
            if (typeof source[key] === 'object') {
                target[key] = cloneDeep1(source[key]); // 注意這里
            } else {
                target[key] = source[key];
            }
        }
    }
    return target;
}

// 使用上面測試用例測試一下
console.log(a)
var b = cloneDeep1(a);
a.name = "前端進階";
a.book.price = "55";
console.log(b);

考慮再全一些的深拷貝

function deepClone(obj,hash = new WeakMap()){ //遞歸實現
    if(obj instanceof RegExp) return new RegExp(obj);
    if(obj instanceof Date) return new Date(obj);
    if(obj === null || typeof obj != "object"){
        // 普通數據類型
        return obj;
    }
    if(hash.has(obj)){
        return hash.get(obj);
    }
    // 下面是數組和對象的判斷
    let t = new obj.constructor();
    hash.set(obj,t);
    for(let key in obj){
        //  遞歸
        if(obj.hasOwnProperty(key)){ //是否是自身的屬性
            t[key] = deepClone(obj[key],hash)
        }
    }
    return t;
}

當然 遞歸很容易爆棧,只是別的方法我還尚未全完能夠理解出來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM