let objA = {
arr: [{ a: 1 }],
object: { b: 2 },
fn: function () {
console.log("123")
},
set: new Set(['d', 'e']),
map: new Map([['e', 3], ['f', 2]]),
regex: /hig/,
nullVal: null,
number: 1
}
//制造缓存
let cacheMap = new Map();
// 深拷贝函数
function deepClone(obj) {
if (typeof obj != 'object' || !obj) {
return obj;
}
//判断是否存在缓存
if (cacheMap.has(obj)) {
return cacheMap.get(obj);
}
// 判断类型是否为 正则
if (obj instanceof RegExp) {
let tmp = new RegExp(obj);
// 存入缓存
cacheMap.set(obj, tmp);
return tmp;
// 判断类型是否为 Map
} else if (obj instanceof Map) {
let tmp = new Map();
obj.forEach((val, key) => {
tmp.set(deepClone(key), deepClone(val));
})
cacheMap.set(obj, tmp);
return tmp;
// 判断类型是否为 Set
} else if (obj instanceof Set) {
let tmp = new Set();
obj.forEach(val => {
tmp.add(deepClone(val))
});
cacheMap.set(obj, tmp);
return tmp;
} else {
// 判断类型是否为 数组和对象
let tmp = new obj.constructor();
for (let key in obj) {
tmp[key] = deepClone(obj[key]);
}
cacheMap.set(obj, tmp);
return tmp;
}
}
// 使用
let objB = deepClone(objA);
记录一个深拷贝方案
最新推荐文章于 2024-07-25 14:02:05 发布