function deepClone(obj,map = new WeakMap()){
if(typeof obj !=='object'|| obj ===null) return obj;
let objFromMap = map.get(obj);
if(objFromMap) return objFromMap;
let target ={};
map.set(obj,target)
if(obj instanceof Map){
target = new Map();
obj.forEach((v,k)=>{
const v1 = deepClone(v,map);
const k1= deepClone(k,map);
target.set(k,v)
})
}
if(obj instanceof Set){
target = new Set();
obj.forEach((v)=>{
target.add(deepClone(v),map)
})
}
if(obj instanceof Array){
target = obj.map(item=>{
return deepClone(item,map)
})
}
if(obj instanceof RegExp) { return new RegExp(obj) }
if(obj instanceof Date) { return new Date(obj) }
for(let key in obj){
target[key]=deepClone(obj[key],map);
}
return target;
}
let obj1 ={
a:1,
b:[2,3,4],
c:function(){
console.log(1)
},
e:new Date(),
d:new Map([[1,2],[true,3]]),
f:new Set([1,3,4,5]),
}
let res = deepClone(obj1);
console.log(res);
// function cloneDeep(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 = cloneDeep(v, map)
// const k1 = cloneDeep(k, map)
// target.set(k1, v1)
// })
// }
// // Set
// if (obj instanceof Set) {
// target = new Set()
// obj.forEach(v => {
// const v1 = cloneDeep(v, map)
// target.add(v1)
// })
// }
// // Array
// if (obj instanceof Array) {
// target = obj.map(item => cloneDeep(item, map))
// }
// // Object
// for (const key in obj) {
// const val = obj[key]
// const val1 = cloneDeep(val, map)
// target[key] = val1
// }
// return target
// }
// 功能测试
// const a = {
// set: new Set([10, 20, 30]),
// map: new Map([['x', 10], ['y', 20]]),
// info: {
// city: '北京'
// },
// fn: () => { console.info(100) }
// }
// console.log( deepClone(a) )
console