2
function deepCopy(obj){
    // 直接返回简单数据类型
    if (
       typeof obj === "number" ||
       typeof obj === "string" ||
       typeof obj === "boolean" ||
       obj === null ||
       obj === undefined
    ) {
       return obj;
    }
    
    // 基obj的原型创建新对象
    const copy = Object.create(Object.getPrototypeOf(obj));
    // getOwnPropertyNames用于获取自身对象中所有的属性,包括不可枚举的属性,不包括原型里的属性。
    var keys = Object.getOwnPropertyNames(obj);

    keys.forEach(key => {
        // 如果是Date对象,特殊处理
        if (Object.prototype.toString.call(obj[key]) === "[object Date]") {
            // 获取日期的毫秒时间戳
            var time = obj[key].valueOf();
            // 重新生成该时间的日期对象
            copy[key] = new Date(time);
        }
        const descriptor = Object.getOwnPropertyDescriptor(obj, key);
        // 如果元素值是对象或数组,则重新递归赋值
        if (
           Object.prototype.toString.call(descriptor.value) === "[object Object]" || 
           Object.prototype.toString.call(descriptor.value) === "[object Array]"
        ) {
            descriptor.value = deepCopy(descriptor.value)
        }
        Object.defineProperty(copy, key, descriptor);
    })
    return copy
}

var obj = { a: {b: 666} };
var copyObj = deepCopy(obj);
console.log(copyObj); // { a: {b: 666} }

    

任天镗
12 声望2 粉丝