- 这是一个简单易懂的深拷贝函数,处理了一些常用的数据结构,如果有特殊的结构需要处理,可以自己添加。
const cloneDeep = (target, hashMap = new WeakMap()) => {
let sType = typeof target
if(target === null || sType !== 'object') {
return target
}
if(sType === 'function') {
return new Function('return ' + target.toString())
}
if(hashMap.has(target)) {
return hashMap.get(target)
}
let dType = Object.prototype.toString.call(target).slice(8, -1)
if(['Array', 'Object'].includes(dType)) {
let cloneData = dType === 'Array' ? [] : {}
hashMap.set(target, cloneData)
for(let key in target) {
cloneData[key] = cloneDeep(target[key], hashMap)
}
return cloneData
}
if(dType === 'Map') {
let cloneData = new Map()
hashMap.set(target, cloneData)
target.forEach((value, key) => {
cloneData.set(cloneDeep(key, hashMap), cloneDeep(value, hashMap))
})
return cloneData
}
if(dType === 'Set') {
let cloneData = new Set()
hashMap.set(target, cloneData)
target.forEach(value => {
cloneData.add(cloneDeep(value, hashMap))
})
return cloneData
}
if (dType === 'Date') {
return new Date(target)
}
if (dType === 'RegExp') {
return new RegExp(target.source, target.flags)
}
return target
}