object.assign 是浅拷贝,只复制第一层属性:基本类型赋值独立,引用类型共享内存;修改第一层基本类型不影响原对象,修改嵌套引用类型的内部属性则会影响原对象。

浅拷贝对象后,修改第一层基本类型属性不会影响原对象;但修改嵌套的引用类型(如对象、数组)内部的值会影响原对象。关键不在“能不能改”,而在于“改的是哪一层、什么类型”。
哪些修改能确保不影响原对象
只要操作的是拷贝对象自身第一层的字符串、数字、布尔、null、undefined 等基本类型属性,原对象完全不受影响:
- 用
{...obj}或Object.assign({}, obj)创建浅拷贝 - 直接给新对象赋新值:
copy.a = 100、copy.name = 'Tom' - 删除属性:
delete copy.age - 新增属性:
copy.id = 123
哪些修改会意外影响原对象
一旦触及嵌套的引用值(比如 obj.info 是个对象,obj.list 是个数组),哪怕只改它里面一个字段,原对象也会同步变化:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
copy.info.city = 'Beijing'→ 原对象obj.info.city也变成 'Beijing' -
copy.list.push('new')→ 原对象obj.list长度和内容同样改变 - 哪怕只是
copy.config.enabled = false,只要config是引用类型,就共享内存
怎么判断某次修改是否安全
看被修改的属性值是不是“直接存的值”:
- 如果
typeof copy.x === 'object'且不为null,那x就是引用,它的内部改动会波及原对象 - 如果
typeof copy.y === 'string' || 'number' || 'boolean',那改它就是安全的 - 可以用
Object.is(copy.x, obj.x)检查两者是否指向同一引用(返回true就说明是浅拷贝共享的)
想彻底避免影响?那就别用浅拷贝
如果业务逻辑需要频繁修改嵌套结构,又必须隔离原数据,浅拷贝就不够用:
- 简单纯 JSON 数据:用
JSON.parse(JSON.stringify(obj))(注意不支持函数、Symbol、Date、undefined、循环引用) - 通用健壮场景:引入
lodash.cloneDeep或使用 structuredClone(现代浏览器支持) - 按需深拷贝局部:只对要改的嵌套字段单独深拷,比如
copy.info = {...obj.info}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










