浅拷贝仅保障顶层基本类型属性修改不影响原对象,嵌套引用类型仍共享内存;安全用法是只改顶层字段或替换整个嵌套层,深层修改需用深拷贝。

浅拷贝本身不能完全保证修改新对象不影响旧对象——它只对第一层基本类型属性有效,嵌套的引用类型(如对象、数组)仍共享内存地址。所以关键不是“能不能”,而是“怎么用才安全”。
只操作顶层基本类型属性
如果原对象只有字符串、数字、布尔值等基础字段,浅拷贝后直接修改这些字段,旧对象不会变:
-
推荐方式:用扩展运算符
{...obj}或Object.assign({}, obj) -
示例:
const user = { name: 'Alice', age: 30 };→const copy = { ...user };→copy.age = 31;不会影响user.age
避免修改嵌套引用类型
一旦对象里有子对象、子数组,浅拷贝后的修改就会穿透到原对象。此时必须绕开直接改嵌套项:
- 改
copy.profile.city?不行——profile是共享引用 - 正确做法:用新对象替换整个嵌套层,例如
copy = { ...copy, profile: { ...copy.profile, city: 'Beijing' } } - 数组同理:不改
copy.list.push(x),而是copy = { ...copy, list: [...copy.list, x] }
提前识别并处理嵌套结构
拿到对象后先判断是否含深层引用,再决定用浅拷贝还是升级为深拷贝:
立即学习“Java免费学习笔记(深入)”;
- 简单检测:
Object.values(obj).some(val => typeof val === 'object' && val !== null) - 若存在嵌套且后续必改深层字段,不如一步到位用
structuredClone(obj)(现代浏览器支持)或JSON.parse(JSON.stringify(obj))(仅限纯数据) - 注意:
JSON方式会丢函数、undefined、Symbol和循环引用
本质上,浅拷贝不是用来“随便改”的工具,而是用于解耦顶层状态的轻量手段。真正要自由修改任意层级,就得选深拷贝方案。


















