我只是为了练习而用Jest编写了一些JavaScript测试.我编写了以下函数:

const divide = (a, b) => {
  if (isNaN(a) || isNaN(b)) {
    throw new Error("This function expect 2 numbers");
  } 
  return a / b;
};

然后我编写了以下测试:

describe("Test divide operator", () => {
  it("Check the divide function", () => {
    expect(divide(10, 0)).toBe(Infinity);
    expect(divide(0, 0)).toBe(NaN);
    expect(divide(Infinity, Infinity)).toBe(NaN);
    expect(divide(10, Infinity)).toBe(0);
    expect(divide(10, -Infinity)).toBe(0);  // THIS TEST FAILS
  });
});

我收到以下错误:

    expect(received).toBe(expected) // Object.is equality

    Expected: 0
    Received: -0

这是一个JavaScript错误吗?有人知道为什么在JavaScript中0可以是负数吗? 在我看来,仅仅为了通过测试而不得不写"-0"是有点尴尬的.

谢谢.

推荐答案

这不是一个错误,而是IEEE-754关于浮点算术的一个"特性".-0是带符号的0,并且javascript正确地实现了它.

这是非常罕见的实际相遇,也是有争议的.其他语言对此的处理方式有所不同.

同样也是-0 === 0 AND -0 === +0,所以正常情况下没有关系.

Javascript相关问答推荐

有没有可能使滑动img动画以更快的速度连续?

函数返回与输入对象具有相同键的对象

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

保持物品顺序的可变大小物品分配到平衡组的算法

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

如何在HTMX提示符中设置默认值?

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

使用Perl Selify::Remote::Driver执行Java脚本时出错

将延迟加载的模块转换为Eager 加载的模块

Chrome上的印度时区名S有问题吗?

在执行console.log(new X())时记录一个字符串

在给定的最小值、最大值和分辨率下计算相同分布的值

查找函数句柄的模块/文件

无法在vue3中的img src上使用v-BIND

如何获取获取器列表