深拷贝的实现
2022, Dec 07
深拷贝的实现
function deepClone(obj,map = new WeakMap()) {
//基本类型
if(typeof obj !=='object' || obj === null) return obj
//避免循环引用
const objFromMap = map.get(obj)
if(objFromMap) return objFromMap
let target = {}
map.set(obj,target)
//Map
if(obj instanceof Map){
target = new Map()
obj.forEach((v,k) => {
const v1 = deepClone(v,map)
const k1 = deepClone(k,map)
target.set(k1,v1)
});
}
//Set
if(obj instanceof Set){
target = new Set()
obj.forEach(v=>{
const v1 = deepClone(v,map)
target.add(v1)
})
}
//Array
if(obj instanceof Array){
target = obj.map(item=> deepClone(item,map))
}
//Object
for(let key in obj){
const val = obj[key]
const val1 = deepClone(val,map)
target[key] = val1
}
return target
}
const a = {
set: new Set([10, 20, 30]),
map: new Map([['x', 10], ['y', 20]]),
info: {
city: 'shanghai'
},
fn: () => { console.info(100) }
}
console.log(deepClone(a))