← 返回文章列表
JavaScript·1642 次阅读

深拷贝的实现与边界情况

深拷贝的实现与边界情况

= 赋值引用类型复制的是指针,改副本会影响原件。需要一份完全独立的副本时,要深拷贝。

方案一:JSON 法

const copy = JSON.parse(JSON.stringify(obj))

最简单,但坑很多:

  • undefined、函数、Symbol 直接丢失
  • Date 变成字符串
  • RegExp、Map、Set 变成空对象 {}
  • 循环引用直接报错

只适合纯 JSON 数据。

方案二:手写递归

function deepClone(source, map = new WeakMap()) {
  if (source === null || typeof source !== 'object') return source
  if (source instanceof Date) return new Date(source)
  if (source instanceof RegExp) return new RegExp(source)

  if (map.has(source)) return map.get(source) // 处理循环引用
  const target = Array.isArray(source) ? [] : {}
  map.set(source, target)

  for (const key of Reflect.ownKeys(source)) { // 包含 Symbol 键
    target[key] = deepClone(source[key], map)
  }
  return target
}

方案三:structuredClone

浏览器和 Node 17+ 内置:

const copy = structuredClone(obj) // 支持循环引用、Date、Map、Set、ArrayBuffer

但函数、DOM 节点、原型链不能克隆。

方案四:工具库

lodash 的 cloneDeep 覆盖面最广,成熟项目首选。

顺带理清浅拷贝

Object.assign、展开运算符 {...obj} 只拷一层,嵌套对象仍是共享的。日常项目里 90% 的场景浅拷贝就够,只有嵌套数据需要整体隔离时才深拷贝——而且大对象深拷贝有性能成本,别随手用。

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4