验证对象引用全等必须用 === 或 assert.strictEqual,二者均基于内存地址比较;传入不同对象(即使内容相同)会失败,深比较或浅拷贝结果不满足引用相等要求。

JavaScript 中验证对象引用的全等关系,必须使用严格相等运算符 ===,且不能依赖 assert.strictEqual 等断言库的“值相等”逻辑——因为对象默认按引用比较,而多数断言函数(如 Node.js 的 assert.strictEqual)本身正是基于 === 实现引用比较,但需注意传参方式和陷阱。
用 assert.strictEqual 直接比较两个变量是否指向同一对象
这是最直接的方式。只要两个变量持有同一个对象的引用,assert.strictEqual(a, b) 就通过;若只是内容相同但内存地址不同,则失败。
- ✅ 正确示例:
assert.strictEqual(obj, obj); // 通过
const sameRef = obj;
assert.strictEqual(obj, sameRef); // 通过
- ❌ 常见误用:传入展开或新构造的对象会失败
const b = { x: 1 };
assert.strictEqual(a, b); // ❌ 失败!不是同一引用
assert.strictEqual(a, { x: 1 }); // ❌ 失败!字面量每次新建对象
避免浅拷贝/结构克隆导致误判
使用 Object.assign、展开运算符 {...obj}、structuredClone 或 JSON 序列化反序列化后,得到的是新对象,与原引用不等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 确保测试目标是“是否为同一实例”,而非“是否等价”
- 若需验证深等价,请改用
assert.deepStrictEqual,但它不满足“引用全等”的要求 - 调试时可用
Object.is(a, b)替代===(二者对对象行为一致,且能正确处理NaN和-0,但对象场景无差别)
在类实例或闭包环境中确认引用未被意外替换
尤其在测试单例、缓存对象、事件监听器绑定或 React Ref 时,需确保获取到的是原始引用。
立即学习“Java免费学习笔记(深入)”;
- 例如测试一个模块导出的单例对象:
const instance2 = require('./mySingleton');
assert.strictEqual(instance1, instance2); // ✅ 验证模块缓存生效
- 再如测试 class 中的私有缓存属性是否复用:
#cache = {};
getCache() { return this.#cache; }
}
const h = new CacheHolder();
assert.strictEqual(h.getCache(), h.getCache()); // ✅ 同一私有属性引用
注意 assert.deepEqual 不适用
assert.deepEqual 比较的是可枚举属性的深度值,完全忽略引用关系。即使两个对象内存地址不同,只要结构一致就通过,这与“引用全等”目标背道而驰。
- ❌ 错误选择:
assert.deepEqual(objA, objB)—— 它可能意外通过,掩盖引用被复制的问题 - ✅ 唯一可靠方式:坚持用
assert.strictEqual或手动objA === objB - 浏览器环境可搭配
console.assert(objA === objB, 'expected same reference')快速校验

















