toBe用于严格相等(Object.is),适合基本类型或同一引用判断;toEqual用于深度内容比对,适合对象、数组等结构。验证“是否同一东西”用toBe,“内容是否一致”用toEqual。

在 Jest 中,toBe 和 toEqual 是最常用的两个断言匹配器,但它们的适用场景和行为逻辑完全不同:前者用于严格相等(引用或基本类型),后者用于深度内容比对(对象/数组结构)。
toBe:用 Object.is 判断严格相等
它底层调用的是 Object.is(),行为类似 ===,但能正确处理 NaN === NaN 为 true、+0 !== -0 等边界情况。只适合基本类型或需判断“是否同一引用”的场景。
- 数字、字符串、布尔、null、undefined、Symbol、BigInt 可安全使用
- 对象或数组即使内容完全一样,只要不是同一个内存地址,
toBe就会失败 - 例如:
expect({a: 1}).toBe({a: 1})❌ 报错(两个不同对象) - 再如:
const arr = [1]; expect(arr).toBe(arr)✅ 通过(同一引用)
toEqual:递归比对对象/数组的每个字段
toEqual 不关心引用,而是逐层检查属性名和值是否一致,支持嵌套对象、数组、Map、Set 等可枚举结构,是测试数据结构内容的首选。
- 自动忽略属性顺序(对象键顺序不影响结果)
- 能识别
undefined与缺失属性的区别({a: 1}和{a: 1, b: undefined}不等) - 支持稀疏数组、Date、RegExp、Error 等内置类型的内容比对
- 例如:
expect({a: 1, b: {c: 2}}).toEqual({b: {c: 2}, a: 1})✅ 通过 - 再如:
expect([1, 2]).toEqual([1, 2])✅ 即使是两个不同数组实例
什么时候该选哪个?
记住一个简单原则:看你要验证的是「是不是同一个东西」还是「内容一不一样」。
- 验证函数返回值是否为某个固定字面量(如
"success"、42、true)→ 用toBe - 验证 API 响应、组件 state、工具函数输出的对象结构 → 用
toEqual - 想确认两个变量指向同一对象(比如单例、缓存引用)→ 用
toBe - 测试 Redux action、React props、mock 返回的数据快照 → 几乎都该用
toEqual
常见误区提醒
别在对象上误用 toBe,也别在基本类型上过度依赖 toEqual(虽不报错,但语义不清)。
-
expect(null).toBe(null)✅ 推荐;expect(null).toEqual(null)✅ 也可,但没必要 -
expect([1,2]).toBe([1,2])❌ 必然失败;必须改用toEqual - 浮点数比较永远别用
toBe或toEqual,改用toBeCloseTo











