assert.deepStrictEqual与assert.deepEqual的区别及报错解析
问题解答:assert.deepEqual与assert.deepStrictEqual的差异
问题背景
使用Node.js 18.8.0、Jest 29.0.3环境编写了如下测试代码:
const assert = require('node:assert') ... it('should clone', () => { const input = { foo: 'bar' } const clone = structuredClone(input) assert.deepEqual(input, clone) assert.deepStrictEqual(input, clone) })
其中assert.deepEqual执行无报错,但assert.deepStrictEqual抛出如下错误:
operator: 'deepStrictEqual' message: 'Values have same structure but are not reference-equal:\n\n{\n foo: 'bar'\n}\n' name: 'AssertionError'
错误信息含义
这条错误的核心意思是:两个值的结构、内容完全一致,但它们并非内存中的同一个对象(引用不同)。structuredClone会创建一个全新的对象实例,和原对象在内存中是独立的两块空间,因此二者的引用地址不相同。
assert.deepEqual与assert.deepStrictEqual的核心差异
相等判断逻辑不同
assert.deepEqual:仅做值的深度相等校验,会递归遍历对象的所有属性,只校验属性值是否一致,不关心两个对象是否为同一内存引用,也不会严格校验值的类型(比如1和'1'在部分场景下会被判定为相等)。assert.deepStrictEqual:做严格的深度相等校验,除了属性值一致外,还要求:- 引用类型(对象、数组等)必须是内存中的同一个引用;
- 值的类型完全一致(比如
1和'1'会被判定为不相等); - 正则、日期等特殊对象,会校验其内部状态的严格一致性。
适用场景不同
- 若仅需验证数据的结构和内容是否匹配,不需要确认是否为同一对象,使用
assert.deepEqual即可; - 若需要确保两个值完全一致(包括引用、类型、内部状态),则使用
assert.deepStrictEqual。
- 若仅需验证数据的结构和内容是否匹配,不需要确认是否为同一对象,使用
内容的提问来源于stack exchange,提问作者Tiago Bértolo
相关产品推荐
相关产品推荐

