// 采用weakMap弱引用,防止内存泄漏。
const deepCopy = ( source , map = new WeakMap()) => {
if(typeof source !== "object" || source == null) return source
// 是否存在循环引用
const sourceFromMap = map.get(source)
if(sourceFromMap) return sourceFromMap
let target
if(source instanceof RegExp){
return source
}else if(source instanceof Map){
target = new Map()
source.forEach((v,k)=>{
const key = deepCopy(k,map)
const value = deepCopy(v,map)
target.set(key,value)
})
}else if(source instanceof Set){
target = new Set()
source.forEach(v=>target.add(deepCopy(v,map)))
}else if(source instanceof Array){
target = []
source.forEach(item=>target.push(deepCopy(item,map)))
}else{
// 只有对象存在循环引用
target = {}
map.set(source,target)
for(let key in source){
target[key] = deepCopy(source[key],map)
}
}
return target
}
let obj = {
arr:[1,2,3,4,5,6],
name:'zs',
age:19,
lover:{
name:'ls',
age:34
}
}
obj.lover.lover = obj
const map = new WeakMap()
console.log(deepCopy(obj,map));
JS深拷贝
于 2022-05-29 09:30:58 首次发布