假设我有以下几点:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
上述两项测试都将通过.在判断数字时,toBe()
和toEqual()
有区别吗?如果是这样的话,我什么时候应该使用一个而不是另一个呢?
假设我有以下几点:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
上述两项测试都将通过.在判断数字时,toBe()
和toEqual()
有区别吗?如果是这样的话,我什么时候应该使用一个而不是另一个呢?
对于基本类型(例如数字、布尔值、字符串等),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
茉莉的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);
希望这有助于澄清一些事情.