终极深拷贝

78 阅读1分钟
const DeepCopy=function(data){
    if(data==null) return data
    if(typeof data=="function") return new Function("return"+data.toString())()
    if(typeof data !=="object") return data
    if(data.constructor===Date) return new Date(data)
    if(data.constructor===RegExp) return new RegExp(data)
    const newData =new data.constructor() //保持继承链
    for (let key in data) {
        if (Object.hasOwnProperty.call(data, key)) { //不遍历其原型链上的属性
            let val = data[key];
            newData[key]=typeof val==="object"||"function"?arguments.callee(val):val
        } // 使用arguments.callee解除与函数名的耦合
    }
    return newData
}