You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 引用类型(对象、数组等)必须是内存中的同一个引用;
      2. 值的类型完全一致(比如1和'1'会被判定为不相等);
      3. 正则、日期等特殊对象,会校验其内部状态的严格一致性。
  • 适用场景不同

    • 若仅需验证数据的结构和内容是否匹配,不需要确认是否为同一对象,使用assert.deepEqual即可;
    • 若需要确保两个值完全一致(包括引用、类型、内部状态),则使用assert.deepStrictEqual。

内容的提问来源于stack exchange,提问作者Tiago Bértolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:20:47