浅拷贝只保证第一层属性独立,嵌套引用类型仍共享内存;修改基本类型或替换整个嵌套属性安全,修改嵌套属性(如copy.address.city)会污染原对象;需改动嵌套结构时应改用深拷贝。

浅拷贝本身无法完全避免修改副本影响原对象——这是它的设计特性,不是缺陷。关键在于:它只保证第一层属性独立,嵌套的引用类型(对象、数组)仍共享内存地址。所以“避免影响”不是靠浅拷贝实现的,而是靠不修改嵌套结构,或在必要时改用深拷贝。
明确哪些操作是安全的
对浅拷贝后的对象,以下操作不会波及原对象:
- 修改第一层的基本类型属性(如字符串、数字、布尔值)
- 替换整个嵌套属性(例如
copy.address = { city: '广州' },而不是copy.address.city = '广州') - 重新赋值数组(如
copy.hobbies = ['画画']),而非 push/pop/splice 等原地修改
哪些操作会意外污染原对象
这些看似“只动副本”的写法,实际会同步改掉原始数据:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
copy.address.city = '深圳'—— 修改嵌套对象属性 -
copy.hobbies.push('骑行')—— 修改嵌套数组内容 -
copy.profile.name = '李四'—— 深层对象任意层级的赋值
想安全修改嵌套结构?换方法
如果业务逻辑确实需要改动嵌套字段又不想影响源数据,浅拷贝就不适用了。此时应:
- 用
JSON.parse(JSON.stringify(obj))快速深拷贝(注意:不支持函数、undefined、Date、RegExp、循环引用) - 使用
structuredClone()(现代浏览器支持,能处理 Date、Map、Set、ArrayBuffer 等) - 引入
lodash.cloneDeep()应对复杂场景(如含循环引用、特殊对象)
日常开发中的实用建议
别把浅拷贝当“保险丝”,而要把它当“轻量快照”:
- 仅用于扁平数据(如配置项、表单初值、简单状态)
- 配合不可变更新模式:用展开语法重建嵌套结构,例如
const newCopy = { ...copy, address: { ...copy.address, city: '杭州' } }; - 在 React/Vue 中,优先用解构+展开替代直接赋值,保持 props/state 的不可变性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










