对象引用与浅拷贝的本质区别在于是否创建新对象容器及嵌套引用是否隔离:对象引用仅复制地址,新旧变量指向同一内存;浅拷贝创建新顶层对象,但嵌套引用类型仍共享原内存。

JavaScript 中区分浅拷贝与对象引用的本质区别,关键在于是否创建了新的对象容器,以及嵌套引用类型是否被隔离。
对象引用是“零拷贝”——只是复制地址,新旧变量指向同一块堆内存;
浅拷贝是“一层新容器 + 内层共享”——顶层对象是新的,但所有嵌套的引用类型(如子对象、数组、Date、RegExp 等)仍共用原内存。
对象引用:根本没拷贝,只是多了一把钥匙
赋值时不做任何复制操作,仅把栈中存储的地址复制给新变量。
- ✅ 速度快、无开销
- ❌ 修改任意一处,另一处同步变化
const obj1 = { name: "张三", info: { age: 25 } };
const obj2 = obj1; // 纯引用赋值
obj2.name = "李四";
obj2.info.age = 30;
console.log(obj1.name); // "李四" → 被改了
console.log(obj1.info.age); // 30 → 被改了
此时 obj1 和 obj2 是同一对象的两个别名,不是副本。
浅拷贝:顶层新建,内层照搬地址
创建一个新对象,把原对象第一层属性的值逐个复制过去:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 基本类型(string/number/boolean等)→ 复制值,互不影响
- 引用类型(object/array等)→ 复制地址,仍共享堆内存
常用方法:
-
Object.assign({}, obj) - 展开运算符
{...obj}或[...arr] - 数组方法:
.slice()、.concat()、.toReversed().reverse()
const obj1 = { name: "张三", info: { age: 25 }, hobbies: ["读书"] };
const obj2 = { ...obj1 }; // 浅拷贝
obj2.name = "李四"; // ✅ 不影响 obj1.name
obj2.info.age = 30; // ❌ 影响 obj1.info.age
obj2.hobbies.push("游泳"); // ❌ 影响 obj1.hobbies
console.log(obj1.info.age); // 30
console.log(obj1.hobbies); // ["读书", "游泳"]
可以看到:只有第一层“表面”被隔离,深层结构依然联动。
如何快速验证是引用还是浅拷贝?
看两点:
-
obj1 === obj2是否为false?-
true→ 是引用(或深拷贝后意外相等,极少见) -
false→ 至少顶层不是同一对象(可能是浅拷贝或深拷贝)
-
- 修改嵌套对象后,原对象是否变化?
- 变化 → 浅拷贝或引用
- 不变 → 深拷贝
const a = { x: 1, y: { z: 2 } };
const b = { ...a };
console.log(a === b); // false → 顶层已分离
console.log(a.y === b.y); // true → 嵌套对象仍共享
总结一句话
对象引用:没新对象,一把钥匙开同一把锁;
浅拷贝:新钥匙配新锁壳,但锁芯还是原来的——嵌套部分没换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










