function deepClone(target, map = new Map()) { if (map.get(target)) { return map.get(target) } if (typeof target === 'object' && target !== null) { const copyTarget = Array.isArray(target) ? [] : {} map.set(target, copyTarget) for (key in target) { if (target.hasOwnProperty(key)) { copyTarget[key] = deepClone(target[key], map) } } return copyTarget } else { return target } } const obj = { a: [1,2,3], b: 4, c: { d: { e: 5 } } } const copyObj = deepClone(obj) console.log(copyObj)