假设我有以下几点:

var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);

上述两项测试都将通过.在判断数字时,toBe()toEqual()有区别吗?如果是这样的话,我什么时候应该使用一个而不是另一个呢?

推荐答案

对于基本类型(例如数字、布尔值、字符串等),toBetoEqual之间没有区别;任何一个都可以为5true"the cake is a lie"工作.

为了理解toBetoEqual之间的区别,让我们想象三个物体.

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.

bc代表功能等效的对象;他们看起来都像

{ foo: { bar: 'baz' } }

如果我们可以说bc"相等",即使它们不代表同一对象,这不是很棒吗?

输入toEqual,它将判断"深度相等"(即,对对象进行递归搜索,以确定其键的值是否相等).以下两项测试都将通过:

expect(b).not.toBe(c);
expect(b).toEqual(c);

希望这有助于澄清一些事情.

Javascript相关问答推荐

被CSS优先级所迷惑

Promise Chain中的第二个useState不更新

阿波罗返回的数据错误,但在网络判断器中是正确的

Html文件和客户端存储的相关问题,有没有可能?

在运行时使用Next JS App Router在服务器组件中运行自定义函数

如何发送从REST Api收到的PNG数据响应

如何将数据块添加到d3力有向图中?

JavaScript不重定向配置的PATH

钛中的onClick事件需要在两次点击之间等待几秒钟

如何限制显示在分页中的可见页面的数量

如何使用Astro优化大图像?

如何根据输入数量正确显示alert ?

如何根据查询结果重新排列日期

更改agGRID/Reaction中的单元格格式

P5JS-绘制不重叠的圆

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

Chart.js Hover线条在鼠标离开时不会消失

如何为两条动态路由创建一个页面?

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?