你最少用几行代码实现深拷贝?

你最少用几行代码实现深拷贝?
最新回答
魔怪小姐

2026-07-04 23:20:36

最少可用 5 行代码 实现基础深拷贝功能(仅处理对象和数组,不考虑特殊对象和循环引用):

function deepClone(obj) { return typeof obj === 'object' && obj !== null ? Array.isArray(obj) ? [...obj].map(e => deepClone(e)) : Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, deepClone(v)])) : obj;}代码说明:
  1. 类型判断

    typeof obj === 'object' && obj !== null 确保处理的是对象或数组(排除 null 的干扰)。

  2. 数组处理

    Array.isArray(obj) 判断是否为数组。

    [...obj].map(e => deepClone(e)) 通过展开运算符创建新数组,并递归深拷贝每个元素。

  3. 对象处理

    Object.entries(obj) 将对象转换为键值对数组。

    .map(([k, v]) => [k, deepClone(v)]) 递归深拷贝每个值。

    Object.fromEntries() 将键值对数组重新组合为新对象。

  4. 基础类型返回

    非对象类型(如数字、字符串等)直接返回原值。

完整版(15 行,支持特殊对象和循环引用):function deepClone(obj, hash = new WeakMap()) { if (obj === null || typeof obj !== 'object') return obj; if (hash.has(obj)) return hash.get(obj); // 处理循环引用 const clone = Array.isArray(obj) ? [] : {}; hash.set(obj, clone); // 存储已拷贝对象 for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { clone[key] = deepClone(obj[key], hash); // 递归拷贝 } } // 处理特殊对象(如 Date、RegExp 等) if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); // 其他特殊对象(如 Map、Set 等)需额外处理 return clone;}关键优化点:
  1. 循环引用处理

    使用 WeakMap 存储已拷贝对象,避免无限递归。

  2. 特殊对象支持

    通过 instanceof 判断并手动创建新实例(如 Date、RegExp)。

  3. 性能优化

    递归时传递 hash 参数,减少重复创建存储结构。

总结:
  • 最小实现:5 行代码可处理基础对象和数组,但功能有限。
  • 完整实现:需 15 行以上代码,支持循环引用、特殊对象和边界情况。
  • 生产环境建议:直接使用 JSON.parse(JSON.stringify(obj))(简单场景)或成熟库(如 Lodash 的 _.cloneDeep)。