编辑代码

const isComplexDataType = obj => (typeof obj === 'object' || typeof obj === 'function') && (obj !== null)

function deepClone(obj, hash = new WeakMap()) {
    if (obj.constructor === Date) { // Date对象
        return new Date(obj)
    }
    if (obj.constructor === RegExp) {
        return new RegExp(obj)
    }
    if (hash.has(obj)) return hash.get(obj)
    const allDes = Object.getOwnPropertyDescriptors(obj);
    const cloneObj = Object.create(Object.getPrototypeOf(obj), allDes);
    hash.set(obj, cloneObj);
    for (let key of Reflect.ownKeys(obj)) { // 获取键
        cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') ? deepClone(obj[key], hash) : obj[key]
    }
    return cloneObj;
}

const demo = {
    a: 1,
    da: new Date(),
    re: /ds/,
    func: function () { console.log('我是一个函数') },
    [Symbol('1')]: 1,
    test1: {
        name: '123'
    }
}

demo.loop = demo;

Object.defineProperty(demo, 'test', {
    enumerable: false,
    value: '不可枚举属性'
})

const copy = deepClone(demo);
console.log(copy);

copy.test1.name = 'test';

console.log(copy);

console.log(demo);