浅拷贝只复制顶层,嵌套对象仍共享引用;深拷贝递归复制全部层级但开销大、不支持循环引用及不可序列化对象。

浅拷贝本身不处理多层嵌套引用的问题——它根本不会进入嵌套层级,只复制第一层属性的值或地址。所以,面对多层嵌套,浅拷贝不是“处理”问题,而是“暴露”问题:你一改深层属性,原对象就跟着变。
浅拷贝为何对嵌套无能为力
因为它的设计目标就是轻量、快速,只做一层“表面复制”:
- 基本类型(string、number、boolean 等)→ 复制实际值,彼此独立
- 引用类型(object、array、date 等)→ 复制的是内存地址,新旧对象共用同一块堆内存
- 哪怕嵌套十层,浅拷贝也只看顶层的
b属性本身,不关心b.c.d.e是什么
遇到嵌套时的实用应对策略
不能靠浅拷贝解决,但可以明确选择更合适的方案:
- 确认是否真需要拷贝:如果只是读取或临时计算,直接用原对象更高效,避免不必要拷贝
-
局部修改用解构+覆盖:只改某几个字段时,可逐层展开再合并,例如:
const copy = { ...obj, info: { ...obj.info, age: 25 } }; -
明确需要完全隔离 → 改用深拷贝:
• 简单纯数据(无函数、undefined、Date、RegExp、循环引用)→JSON.parse(JSON.stringify(obj))
• 更健壮通用 →structuredClone(obj)(现代浏览器和 Node.js 18.10+ 原生支持)
• 需兼容老环境或特殊类型 → 使用 Lodash 的_.cloneDeep()
哪些操作看似“解决嵌套”,实则仍是浅拷贝
这些写法容易误解为“处理了嵌套”,其实没有:
-
{...obj, info: {...obj.info}}—— 只深了一层,info里再有对象仍共享引用 -
Object.assign({}, obj, { info: Object.assign({}, obj.info) })—— 同样只到第二层 - 数组的
[...arr]或arr.slice()—— 对数组内对象元素不递归,仍是浅拷贝
浅拷贝不是缺陷,是定位清晰的工具。关键在理解它“止步于第一层”的边界,该用深拷贝时不硬扛,该避免拷贝时也不画蛇添足。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











