遞歸實(shí)現(xiàn)深拷貝

使用遞歸函數(shù)來實(shí)現(xiàn)一個(gè)對象的深拷貝

function copy(obj) {
    let newObj = null; // 聲明一個(gè)對象來存儲拷貝之后的內(nèi)容
    
    // 判斷數(shù)據(jù)類型是否是復(fù)雜的數(shù)據(jù)類型,如果是則調(diào)用自己,如果不是則直接賦值即可!
    // 由于null不可以循環(huán)但是他的類型又是object,所以這個(gè)需要對null進(jìn)行判斷
    if (typeof(obj) == 'object' && obj !== null){
        // 聲明一個(gè)變量用以存儲拷貝出來的值,根據(jù)參數(shù)的具體數(shù)據(jù)類型聲明不同的類型來存儲
        newObj = obj instanceof Array? [] : {};
        // 循環(huán)obj的每一項(xiàng),如果里面還有復(fù)雜的數(shù)據(jù)類型的話,則直接利用遞歸函數(shù)再次調(diào)用。
        for(let i in obj){
            newObj[i] = copy(obj[i])
        }
    } else {
        newObj = obj
    }
    return newObj; // 函數(shù)沒有返回的值的話,則為undefined
}
let obj = { // 原對象,包含字符串,對象,函數(shù),數(shù)組等不同類型。
   name: "test",
   main:{
       a:1,
       b:2
   },
   fn:function(){
       
   },
   firends:[1,2,3,[44,55]];
    
}

let obj1 = copy(obj);
obj1.name = '修改值';
obj1.main.a = 110;
console.log(obj,obj1);
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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