From c6739e5279a5c7a54b31f76f93735d08d4fbecb7 Mon Sep 17 00:00:00 2001 From: Lei OT Date: Wed, 10 Jul 2024 17:25:04 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=85=AC=E5=85=B1=E5=87=BD=E6=95=B0:?= =?UTF-8?q?=20=E6=B7=B1=E6=8B=B7=E8=B4=9D.=20=E8=A7=A3=E5=86=B3=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/commons.js | 56 +++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 16 deletions(-) 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; } - /** * 向零四舍五入, 固定精度设置 */