diff --git a/src/utils/commons.js b/src/utils/commons.js index 2e83226..29fd1d6 100644 --- a/src/utils/commons.js +++ b/src/utils/commons.js @@ -255,23 +255,47 @@ export function omit(object, keysToOmit) { /** * 深拷贝 */ -export function cloneDeep(value) { - // return structuredClone(value); - if (typeof value !== "object" || value === null) { - return value; - } - - const result = Array.isArray(value) ? [] : {}; - - for (const key in value) { - if (Object.prototype.hasOwnProperty.call(value, key)) { - result[key] = cloneDeep(value[key]); - } - } - - return result; +export function cloneDeep(value, visited = new WeakMap()) { + // 处理循环引用 + 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; + } + + // 创建一个新的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) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + // 处理普通属性 + result[key] = cloneDeep(value[key], visited); + } + } + + return result; } - /** * 向零四舍五入, 固定精度设置 */