深拷贝的实现与边界情况
深拷贝的实现与边界情况
= 赋值引用类型复制的是指针,改副本会影响原件。需要一份完全独立的副本时,要深拷贝。
方案一: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 条
还没有评论,来抢沙发~