在这篇文章看到的,https://mp.weixin.qq.com/s/lCytacvU-EhlO0pxaBz6vA 我只是记录一下,以后用的时候好参考,嗯,只是参考而已,哈哈哈。大佬要是看到啦,希望不要介意。
Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。
返回所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
深度克隆(深拷贝)大体可以概括为三种方式:
- JSON.stringify+JSON.parse, 这个很好理解;
- 全量判断类型,根据类型做不同的处理
- 2的变型,简化类型判断过程
引用数据类型有哪些
ES6之前:Object, Array, Date, RegExp, Error,
ES6之后:Map, Set, WeakMap, WeakSet,
简单粗暴版本
function deepClone(obj) {
let res = {};
// 类型判断的通用方法
function getType(obj) {
return Object.prototype.toString.call(obj).replaceAll(new RegExp(/\[|\]|object /g), "");
}
const type = getType(obj);
const reference = ["Set", "WeakSet", "Map", "WeakMap", "RegExp", "Date", "Error"];
if (type === "Object") {
for (const key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
res[key] = deepClone(obj[key]);
}
}
} else if (type === "Array") {
console.log('array obj', obj);
obj.forEach((e, i) => {
res[i] = deepClone(e);
});
}
// 优化段开始
else if (type === "Date") {
res = new Date(obj);
} else if (type === "RegExp") {
res = new RegExp(obj);
} else if (type === "Map") {
res = new Map(obj);
} else if (type === "Set") {
res = new Set(obj);
} else if (type === "WeakMap") {
res = new WeakMap(obj);
} else if (type === "WeakSet") {
res = new WeakSet(obj);
}else if (type === "Error") {
res = new Error(obj);
}
else {
res = obj;
// 优化段结束
// 上面简单优化可为下方这样 =》
else if (reference.includes(type)) {
res = new obj.constructor(obj);
} else {
res = obj;
}
return res;
}
return res;
大神的方法
function deepClone(obj, hash = new WeakMap()) {
if (hash.has(obj)) {
return obj;
}
let res = null;
const reference = [Date, RegExp, Set, WeakSet, Map, WeakMap, Error];
if (reference.includes(obj?.constructor)) {
res = new obj.constructor(obj);
} else if (Array.isArray(obj)) {
res = [];
obj.forEach((e, i) => {
res[i] = deepClone(e);
});
} else if (typeof obj === "object" && obj !== null) {
res = {};
for (const key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
res[key] = deepClone(obj[key]);
}
}
hash.set(obj, res);
} else {
res = obj;
}
return res;
}
网友评论