JS实现深拷贝
注意解决
循环引用
问题
function deepClone(obj) {
// 记录处理过的对象,解决循环引用问题
let map = new WeakMap()
function clone(obj) {
// 其他类型,如字符串、数字的直接返回
if(typeof obj !== 'object') {
return obj
}
// 循环引用了,之前已经处理过,直接返回
if(map.has(obj)) {
return map.get(obj)
}
// 判断是数组还是对象
let newObj = Array.isArray(obj) ? [] : {}
// 记录处理过的对象
map.set(obj, newObj) // 注意不能写在for循环后面
for(let key in obj) {
newObj[key] = clone(obj[key])
}
return newObj
}
return clone(obj)
}
let obj = { name: '1', address: {x: 100, y: 100}}
obj.o = obj
console.log(deepClone(obj))