function cloneDeep(old) { let map = new WeakMap() return cloneDeepCon(old, map)}function cloneDeepCon(old, map) { if (!(old && typeof old === 'object')) return old let existObj = map.get(old) if (existObj) return existObj let oldClone = Array.isArray(old) ? [] : {} map.set(old, oldClone) let keys = Object.getOwnPropertyNames(old) keys.forEach((key) => { oldClone[key] = cloneDeepCon(old[key], map) Object.defineProperty( oldClone, key, Object.getOwnPropertyDescriptor(old, key) ) }) return oldClone}