fe-notes
fe-notes copied to clipboard
实现一个比较详细的深拷贝
function deepClone (origin = {}, target = {}, map = new WeakMap()) {
if (typeof origin !== 'object') return origin
if (origin === null) return null
if (origin instanceof RegExp) return new RegExp(origin)
if (origin instanceof Date) return new Date(origin)
if (origin instanceof Set) {
let _set = new Set()
origin.forEach(item => _set.add(item))
return _set
}
if (origin instanceof Map) {
let _map = new Map()
origin.forEach((val, key) => _map.set(key, val))
return _map
}
if (map.has(origin)) return map.get(origin)
map.set(origin, target)
for (const key in origin) {
if (origin.hasOwnProperty(key)) {
if (typeof origin[key] !== 'object') {
target[key] = origin[key]
} else {
target[key] = Array.isArray(origin[key]) ? [] : {}
target[key] = deepClone(origin[key], target[key], map)
}
}
}
return target
}
let set = new Set()
set.add(4).add(5).add(6)
let map = new Map()
map.set('name', 'chuck').set('gender', 'male')
let obj = {
a: 1,
b: {
c: '2',
d: [1, 2, 3]
},
reg: new RegExp('reg'),
date: new Date('2022/9/27'),
set,
map,
getName: () => {
return 'chuck'
},
undef: undefined,
empty: null,
symbol: Symbol('symbol')
}
let obj2 = {
a: 2,
next: obj
}
obj.next = obj2
let obj3 = Object.create(obj)
obj3.a = 1
console.log('deepClone', deepClone(obj))