被e签宝笔试吊打的一天,js中的数据类型分为引用数据类型与基本数据类型引用数据类型就是object,与跟java中存储引用数据类型相似,栈中存储引用,就是地址,堆中存储的数据
个人认为object结构就是一棵树,所以对其深拷贝主要思想是进行深度优先,递归遍历就行
深拷贝就是完全copy一个对象,完全不同的存储空间,拷贝的对象互不影响,深拷贝如果被拷贝的对象的中的属性的数据类型不特殊(不包括函数,时间,undefined,NaN,不能解决循环引用的问题)的话也可以直接使用序列化与反序列化去处理
主要去考虑了循环引用,特殊数据类型处理的问题,但是处理循环引用时并没有去使用weakMap,而是直接使用的map去记录对象之间的引用关系,如果发现对象已被引用,直接continue出来就行
然后特殊的去处理Date,正则,数组,数组的话多此一举使用es6中新增的from
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
}
- THE END -
非特殊说明,本博所有文章均为博主原创。
共有 0 条评论