-----------------------------------------------------
function initNewObj(obj) {
const objTag = {
objectTag: '[object Object]',
arrayTag: '[object Array]',
dateTag: '[object Date]',
regexpRag: '[object RegExp]'
}
let newObj
const objType = Object.prototype.toString.call(obj)
switch(objType) {
case objTag.objectTag:
newObj = {}
break
case objTag.arrayTag:
newObj = []
break
case objTag.dateTag:
// 创建新的日期对象
newObj = new Date(obj.getTime())
break
case objTag.regexpRag:
// 创建新的正则表达式对象
newObj = new RegExp(obj.source,obj.flags)
break
default:
break
}
return newObj || {}
}
------------
function deepClone(obj,map=new Map()) {
if (typeof obj !== 'object' || obj === null) return obj
// 如果已经拷贝过,直接返回即可
if (map.has(obj)) return map.get(obj)
let newObj = initNewObj(obj)
// 以当前对象为键,新对象为值
map.set(obj,newObj)
for (let key in obj) {
// 如果属性值是对象,则需要递归去调用拷贝函数
if (typeof obj[key] === 'object' && obj[key] !== null && obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key],map)
} else {
newObj[key] = obj[key]
}
}
return newObj
}
-------------------------