深拷贝,解决嵌套循环问题。
function deepClone(target) {
const map = new WeakMap()
function _deepClone(value) {
if (typeof value !== 'object' || value === null) return value
if (value instanceof Date) return new Date(value.getTime())
if (value instanceof RegExp) return new RegExp(value)
if (map.has(value)) return map.get(value)
const result = Array.isArray(value) ? [] : {}
map.set(value, result)
for (const key in value) {
if (value.hasOwnProperty(key)) {
result[key] = _deepClone(value[key])
}
}
return result
}
return _deepClone(target)
}
const obj = {
a: 1,
b: [2, 3, 4],
c: {d: 5},
}
obj.e = obj
const newObj = deepClone(obj)
console.log(obj, newObj) // 输出直观上两个obj内容相等
console.log(obj !== newObj) // true
console.log(obj.e !== newObj.e) // true
console.log(newObj.e === newObj) // true