深拷貝函數(shù)實現(xiàn)

思路:
1.判斷是否為引用類型
2.判斷是否為String對象、Number對象以及Bool對象
3.對日期對象做處理
4.區(qū)分?jǐn)?shù)組和對象做處理
5.對函數(shù)做拷貝
6.還有一些內(nèi)置類沒做處理(如正則,錯誤等),后續(xù)有時間再處理

let deepCopy = function(data = {}){
    //string,number,bool,null,undefined,symbol
    //object,array,date
    if(data&&typeof data==="object"){
        //針對函數(shù)的拷貝
        if(typeof data==="function"){
            let tempFunc = data.bind(null)
            tempFunc.prototype = deepCopy(data.prototype)
            return tempFunc
        }

        switch(Object.prototype.toString.call(data)){
            case "[object String]":return data.toString()
            case "[object Number]":return Number(data.toString())
            case "[object Boolean]":return new Boolean(data.toString())
            case "[object Date]":return new Date(data.getTime())
            case "[object Array]":
                let arr = []
                for(let i=0;i<data.length;i++){
                    arr[i] = deepCopy(data[i])
                }
                return arr
            
            //js自帶對象或用戶自定義類實例
            case "[object Object]":
                  let obj = {}
                for(let key in data){
                    //會遍歷原型鏈上的屬性方法,可以用hasOwnProperty來控制 (obj.hasOwnProperty(prop)
                    obj[key] = deepCopy(data[key])
                }
                return obj
        }
    }else{
        //string,number,bool,null,undefined,symbol
        return data
    }
}

測試:

let a = {
    hobbits:["sing","dance",{
        read:["hlm","shz"],
        walk:{
            type:"sports",
            content:"walk"
        },
        run:{
            type:"sports",
            content:"run"
        },
    }],
    b:{
        age:10,
        c:{
            name:"c"
        }
    }
}
b = deepCopy(a)
console.log(b)
// {
//     hobbits:["sing","dance",{
//         read:["hlm","shz"],
//         walk:{
//             type:"sports",
//             content:"walk"
//         },
//         run:{
//             type:"sports",
//             content:"run"
//         },
//     }],
//     b:{
//         age:10,
//         c:{
//             name:"c"
//         }
//     }
// }
console.log(a===b) //false

總結(jié)主要的點:
1.遍歷到對象和數(shù)組時,創(chuàng)建對應(yīng)的類型的空數(shù)據(jù)
2.像空數(shù)據(jù)內(nèi)填充內(nèi)容
3.返回這個數(shù)組或者對象

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

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

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