判断浅拷贝还是深拷贝的关键是看嵌套对象引用是否被复用:若修改拷贝对象的嵌套属性导致原对象变化,则为浅拷贝;否则为深拷贝。可通过===比较嵌套对象引用或直接修改测试影响来验证。

判断一个对象拷贝是浅拷贝还是深拷贝,关键看**嵌套对象(或数组)的引用是否被复用**:如果修改拷贝后对象的嵌套属性,原对象也跟着变,那就是浅拷贝;如果互不影响,就是深拷贝。
看嵌套对象的内存地址是否相同
最直接的方法是检查嵌套的子对象(如对象里的对象、数组里的对象)在拷贝前后是否指向同一块内存:
- 用 === 比较原对象中某个嵌套对象与拷贝对象中对应位置的嵌套对象
- 如果返回 true,说明是浅拷贝(共享引用)
- 如果返回 false,且内容一致,大概率是深拷贝(新建了对象)
示例:
const original = { a: 1, b: { c: 2 } };
const shallow = { ...original }; // 浅拷贝
const deep = JSON.parse(JSON.stringify(original)); // 简单深拷贝(无函数、undefined等)
console.log(shallow.b === original.b); // true → 浅拷贝
console.log(deep.b === original.b); // false → 深拷贝
修改嵌套属性,观察原对象是否受影响
这是更贴近实际效果的验证方式,不需要记原理,动手试一试就知道:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 对拷贝对象的某一层嵌套属性赋新值(比如 copy.nested.prop = 'new')
- 再检查原对象对应路径的值是否变化
- 变了 → 浅拷贝;没变 → 深拷贝
示例:
const obj = { x: 1, y: { z: 2 } };
const copied = Object.assign({}, obj);
copied.y.z = 999;
console.log(obj.y.z); // 输出 999 → 浅拷贝生效了
注意常见“伪深拷贝”陷阱
有些方法看起来像深拷贝,但其实只处理了一层或有局限性:
-
JSON.parse(JSON.stringify()):遇到
undefined、function、Symbol、Date、RegExp、循环引用会丢失或报错 - structuredClone()(现代浏览器支持):真正可靠的深拷贝,能处理多数内置类型和循环引用
- Lodash 的 _.cloneDeep():兼容性好、健壮,适合复杂场景
小结:一句话判断法
只要拷贝后的对象里,任意一个**对象类型的属性(包括数组)还和原对象里完全相等(===)**,那它就不是真正的深拷贝——哪怕其他层级都独立了,只要有一处引用没断开,就是浅拷贝或不彻底的深拷贝。

















