const deepClone = (form, to = {}, map = new Map()) => {
//map去存储对象的引用信息
if (typeof form !== 'object')
return form
for (let key in form) {
if (!form.hasOwnProperty(key)) continue; //不是的话为真
//判断是否为原型链上的属性
if (form[key] && typeof form[key] == 'object') {
//找他的原型对象 是obj还是array
//如果不去很判断的话 默认是对象的
// () && to[key] = new Date(form[key]
//时间对象的处理(不处理的话是不能拷贝的)
if (map.has(form[key])) {
to[key] = map.get(form[key])
continue
} //判断该对象是否已被引用 是的话直接赋值后返回
if (form[key] instanceof Object) {
map.set(form[key], form[key])
to[key] = deepClone(form[key], to[key], map)
} //如果是一个Object的话直接记录下来 然后再进行递归
if (form[key] instanceof Date) to[key] = new Date(form[key])
if (form[key] instanceof RegExp) to[key] = form[key]
if (form[key] instanceof Array) to[key] = Array.from({
...to[key],
})
} else {
to[key] = form[key]
}
// console.log(key,typeof form[key])
}
return to
}
主要就是递归的思想 然后进行分类,处理循环引用直接用的map(map的key可以为对象)