用 === 比较嵌套引用类型属性可判断浅拷贝是否共享内存:若 copy.b === original.b 为 true 且 b 是对象,则确认浅拷贝未断开深层引用,修改拷贝对象会同步影响原对象。

直接用 === 比较嵌套的引用类型属性,就能判断浅拷贝后是否仍共享引用。
用 === 判断嵌套对象是否共用内存
浅拷贝只断开第一层,深层对象依然指向同一块内存。只要对拷贝后的对象修改某一层嵌套值,原对象对应位置也跟着变,就说明它们共享引用。
- 取拷贝对象中某个属性(比如
copy.b),和原对象同名属性(original.b)用===对比 - 结果为
true→ 共享引用,确认是浅拷贝 - 结果为
false→ 不共享,可能是深拷贝或该属性本身是基本类型
注意区分基本类型和引用类型的判断逻辑
基本类型(字符串、数字、布尔等)天然不共享,=== 返回 true 只代表值相等,不能说明引用关系;只有对象、数组、函数、Date 等引用类型,=== 为 true 才真正意味着内存地址相同。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如:
copy.a === original.a是true,但a是数字,这很正常,不说明共享 - 而
copy.b === original.b是true,且b是对象,这就明确表明浅拷贝没断开深层引用
动手验证一个典型例子
写几行代码马上能看清楚:
const original = { a: 1, b: { c: 2 } };
const copy = { ...original }; // 浅拷贝
console.log(copy.b === original.b); // true → 共享引用
copy.b.c = 999;
console.log(original.b.c); // 999 → 原对象被意外修改
这种联动现象就是浅拷贝最典型的特征,也是它容易引发 bug 的地方。
避免误判:排除不可枚举属性和 Symbol 键
像 Object.assign 和展开运算符默认不处理不可枚举属性或 Symbol 键,如果你的源对象有这类属性,仅靠 === 检查常规属性可能不够全面。
- 检查前先确认你对比的属性确实被拷贝进去了(可用
console.dir或Object.getOwnPropertyNames查看) - 涉及
Symbol属性时,需显式遍历Object.getOwnPropertySymbols()并单独比对
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










