数据存储and深拷贝

2023-5-18 897 5/18

被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

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论