对于原始类型(例如数字、布尔值、字符串等),toBe 和 toEqual 之间没有区别;任何一个都适用于5、true 或"the cake is a lie"。
要了解toBe 和toEqual 之间的区别,让我们想象三个对象。
var a = { bar: 'baz' },
b = { foo: a },
c = { foo: a };
使用严格比较(===),有些东西是“相同的”:
> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
但是有些东西,即使它们“相等”,也不是“相同”的,因为它们代表了存在于内存中不同位置的对象。
> b === c
false
Jasmine 的 toBe 匹配器只不过是严格相等比较的包装器
expect(c.foo).toBe(b.foo)
和
是一样的
expect(c.foo === b.foo).toBe(true)
不要只相信我的话;见the source code for toBe。
但是b 和c 代表功能上等价的对象;他们都长得像
{ foo: { bar: 'baz' } }
如果我们可以说 b 和 c 是“相等的”,即使它们不代表同一个对象,那不是很好吗?
输入toEqual,它会检查“深度相等”(即递归搜索对象以确定它们的键值是否相等)。以下两项测试都将通过:
expect(b).not.toBe(c);
expect(b).toEqual(c);
希望这有助于澄清一些事情。