最近在看Javascript基础的时候看到了深拷贝的问题,就巧用ES6新特性写了一个深拷贝方法。废话不多说代码奉上。
const toString = Object.prototype.toString
const getType = function() {
const target = [...arguments][0]
const typeStr = toString.call(target)
return function() {
const type = [...arguments][0]
return typeStr.includes(type)
}
}
const deepClone = (obj, map = new WeakMap()) => {
//undefined、null、number、bool、String、function
if (typeof obj != 'object' || obj === null) {
return obj
}
if (map.has(obj)) {
return map.get(obj)
}
let target = new obj.constructor() //基于obj的原型建立一个新的对象
map.set(obj, target)
const isType = getType(obj)
if (obj instanceof Date) {
return target
}
if (isType('Set')) {
//处理类型是Set
for (let item of obj) {
target.add(deepClone(item, map))
}
return target
}
if (isType('Map')) {
//处理Map
for (let [key, value] of obj) {
target.set(key, deepClone(value, map))
}
return target
}
if (isType('Object') || isType('Array')) {
//统一处理Object、Array,因为他们统一可以使用key=>value键值这种方式
for (let [key, value] of Object.entries(obj)) {
target[key] = deepClone(value, map)
}
return target
}
}
此代码并不完善。并没有处理Symbol以及正则对象。未完待续。。。。