let map = new Map()
map.set('key1',1)
map.set('key2',[1,2,3])
let set = new Set()
set.add([1,2,3])
set.add(123)
let obj1 = {
a:1,
b:[1,2,3,4],
c:Number(3),
d:String(4),
e:{
e1:1,
e2:[1,2,3]
},
f:new RegExp(),
g:map,
h:undefined,
i:null,
j:Symbol('j'),
k:new Date(),
}
obj1.loop = obj1
function deepClone(obj,map=new WeakMap()){
if(obj===null || typeof obj!=="object" || obj instanceof Date || obj instanceof RegExp){
return obj
}
if(map.get(obj)){
return map.get(obj)
}
if(obj instanceof Map){
let newObj = new Map()
map.set(obj,newObj)
for(let entry of obj){
newObj.set(entry[0],deepClone(entry[1],map))
}
return newObj
}else if(obj instanceof Set){
let newObj = new Set()
map.set(obj,newObj)
for(let val of obj){
newObj.add(deepClone(val,map))
}
return newObj
}else if(obj instanceof Array){
let newObj = []
map.set(obj,newObj)
for(let key in obj){
newObj[key] = deepClone(obj[key],map)
}
return newObj
}else if(obj instanceof Object){
let newObj = {}
map.set(obj,newObj)
for(let key in obj){
newObj[key] = deepClone(obj[key],map)
}
return newObj
}
}
let newObj = deepClone(obj1)
console.log(newObj,obj1);
JS手写——实现深拷贝(考虑Map、Set、Date、RegExp、循环引用)
最新推荐文章于 2023-05-31 21:23:29 发布