验证深浅拷贝的关键是修改副本嵌套属性后原对象是否被影响;需用含引用类型属性的对象测试,检查顶层属性独立性、嵌套对象隔离性及引用地址差异,并覆盖Date、正则、循环引用等边界情况。

验证深拷贝和浅拷贝,关键不是看代码写了什么,而是看修改副本后原对象是否被影响——尤其要测嵌套结构。
用嵌套对象做核心测试用例
必须构造含引用类型属性的对象,比如:
const original = { a: 1, b: { c: 2 }, d: [3, 4] };
只改顶层属性(如 a)无法区分深浅拷贝,所有拷贝方式都不会影响原对象。真正能暴露问题的是修改 b.c 或 d[0] 这类嵌套值。
立即学习“Java免费学习笔记(深入)”;
断言逻辑要分层写清楚
对每个拷贝结果,至少检查三项:
- 顶层基本属性是否独立:修改
copy.a = 99后,original.a仍为1 - 嵌套对象属性是否隔离:修改
copy.b.c = 88后,original.b.c仍为2(深拷贝才应满足) - 引用地址是否不同:
copy.b !== original.b和copy.d !== original.d都应为true
注意特殊值和边界情况
仅用普通对象测试不够全面,还需覆盖:
-
Date 对象:深拷贝后应仍是
Date实例,而非字符串 -
正则表达式:
/abc/g拷贝后应能正常执行.test() -
循环引用:构造
let obj = {}; obj.self = obj;,深拷贝不应报错或卡死 -
函数和 undefined:若使用
structuredClone,需预期它会抛DataCloneError;若用JSON.parse(JSON.stringify()),函数会被丢弃
推荐测试写法(Jest 示例)
不必追求一次性覆盖全部,先写一个最小可验证案例:
describe('deep clone', () => {
it('should isolate nested object changes', () => {
const original = { x: 1, y: { z: 2 } };
const copy = structuredClone(original); // 或你实现的 deepClone()
copy.y.z = 99;
expect(original.y.z).toBe(2);
expect(copy.y).not.toBe(original.y);
});
});
这种断言直击本质:改了副本的嵌套值,原对象没变,且两个嵌套对象内存地址不同。


















