浅拷贝数组时嵌套对象引用天然保留,如[...arr]、slice()等只复制第一层,内部对象仍共享内存地址,修改副本中对象属性会影响原数组。

浅拷贝数组时,嵌套对象的引用本来就会被保留——这正是浅拷贝的定义和行为,不是需要“特意保留”,而是它天然如此。
浅拷贝的本质就是只复制第一层
当你用 [...arr]、arr.slice()、Array.from(arr) 或 arr.concat() 拷贝一个含对象的数组时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 数组本身是新生成的,长度、索引顺序独立
- 但每个元素如果是对象、数组、函数等引用类型,拷贝进去的只是原引用(同一内存地址)
- 所以
newArr[0] === oldArr[0]为 true
典型例子:修改嵌套对象会影响原数组
比如:
const original = [{ name: 'Alice' }, { age: 30 }];
const copied = [...original];
copied[0].name = 'Bob'; // 修改副本中第一个对象的属性
console.log(original[0].name); // 输出 'Bob' —— 原数组也被改了
哪些操作会触发这种引用共享
- 数组方法:
slice()、concat()、展开运算符[...arr]、Array.from(arr) - 对象方法:
Object.assign({}, obj)、{...obj} - 所有这些都只在第一层新建容器,内部引用照搬不误
如果你本意是“想保留引用”,那无需额外操作
只要不用深拷贝手段(如 structuredClone()、JSON.parse(JSON.stringify()) 或 lodash.cloneDeep()),默认的数组拷贝方式就满足这个需求。它轻量、快速,适合仅需隔离数组结构、允许内部状态共用的场景——比如作为视图层数据快照、临时排序或过滤,又不打算独立修改子对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










