function deepClone(target, map = new Map()) {
let type = getType(target)
if (type === 'Array' || type === 'Object') {
let cloneTarget = map.get(target)
if (cloneTarget) {
return cloneTarget
}
cloneTarget = type === 'Array' ? [] : {}
map.set(target, cloneTarget)
for (let key in target) {
if (target.hasOwnProperty(key)) {
cloneTarget[key] = deepClone(target[key], map)
}
}
return cloneTarget
} else {
return target
}
}
function getType(data) {
return Object.prototype.toString.call(data).slice(8, -1)
}
const obj = {
a: {},
b: [],
fn: function () {},
}
obj.a.c = obj.b
obj.b[0] = obj.a
console.log(deepClone(obj))