perf: 公共函数: 深拷贝. 解决内存泄漏

perf/export-docx
Lei OT 12 months ago
parent e1ec006772
commit c6739e5279

@ -255,23 +255,47 @@ export function omit(object, keysToOmit) {
/** /**
* 深拷贝 * 深拷贝
*/ */
export function cloneDeep(value) { export function cloneDeep(value, visited = new WeakMap()) {
// return structuredClone(value); // 处理循环引用
if (typeof value !== "object" || value === null) { if (visited.has(value)) {
return visited.get(value);
}
// 特殊对象和基本类型处理
if (value instanceof Date) {
return new Date(value);
}
if (value instanceof RegExp) {
return new RegExp(value.source, value.flags);
}
if (value === null || typeof value !== 'object') {
return value; return value;
} }
const result = Array.isArray(value) ? [] : {}; // 创建一个新的WeakMap项以避免内存泄漏
let result;
if (Array.isArray(value)) {
result = [];
visited.set(value, result);
} else {
result = {};
visited.set(value, result);
}
for (const key of Object.getOwnPropertySymbols(value)) {
// 处理Symbol属性
result[key] = cloneDeep(value[key], visited);
}
for (const key in value) { for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) { if (Object.prototype.hasOwnProperty.call(value, key)) {
result[key] = cloneDeep(value[key]); // 处理普通属性
result[key] = cloneDeep(value[key], visited);
} }
} }
return result; return result;
} }
/** /**
* 向零四舍五入, 固定精度设置 * 向零四舍五入, 固定精度设置
*/ */

Loading…
Cancel
Save