手寫一個(gè)深拷貝(深克隆)

1. 首先使用JSON.parse來實(shí)現(xiàn)一個(gè)深拷貝

let test = {
    x : 1,
    y : 2,
    z : {
        a : 4,
        b : 5
    }
}
// 深拷貝
let result = JSON.parse(JSON.stringify(test));
// 改變拷貝后的值
result.z.a = 40;
console.log(test);
console.log(result);

2. 手寫實(shí)現(xiàn)深拷貝

function deepClone(obj){
    let cloneObj;
    // 判斷當(dāng)輸入的數(shù)據(jù)是簡單數(shù)據(jù)類型時(shí),直接復(fù)制
    if(obj && typeof obj !== 'object'){
        cloneObj = obj;
    }
    // 當(dāng)輸入的數(shù)據(jù)是對象或者數(shù)組時(shí)
    else if(obj && typeof obj === 'object'){
        // 檢測輸入的數(shù)據(jù)是數(shù)組還是對象
        cloneObj = Array.isArray(obj) ? [] : {};

        // 變量數(shù)據(jù)對象
        for(let key in obj){
            // 判斷對象是否存在key屬性
            if(obj.hasOwnProperty(key)){
                if(obj[key] && typeof obj[key] === 'object'){
                    // 若當(dāng)前元素類型為對象時(shí),遞歸調(diào)用
                    cloneObj[key] = deepClone(obj[key]);
                }
                // 若當(dāng)前元素類型為基本數(shù)據(jù)類型
                else{
                    cloneObj[key] = obj[key];
                }
            }
        }
    }
    return cloneObj;
}

// 測試用例
deepClone({
  x: 1,
  y: [ 5, 6, 7 ],
  z: {
    a: 0,
    b: 1
  }
})

測試發(fā)現(xiàn)兩種效果是一樣的,深拷貝完成。

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

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