当前位置: 首页 > 面试题库 >

+0和-0是否相同?

吕宇定
2023-03-14
问题内容

通过阅读的ECMAScript 5.1规范,+0-0被区分。

那为什么要+0 === -0评估true


问题答案:

JavaScript使用IEEE754标准表示数字。:

有符号的零 为零,具有相关的符号。在普通算术中,-0 = +0 =0。但是,在计算中,某些数字表示形式允许存在两个零,通常用
-0(负零)+0(正零)表示
。这在某些带符号的整数表示形式以及大多数浮点数表示形式中都会发生。数字0通常被编码为+0,但是可以用+0或-0表示。

用于浮点算术的IEEE 754标准(当前由支持浮点数的大多数计算机和编程语言所使用)都需要+0和-0。零可被视为扩展实数线的变体,因此1 / −0
=-∞和1 / + 0 = +∞,仅对±0 /±0和±∞/±∞未定义以零除。

本文包含有关不同表示形式的更多信息。

因此,这就是为什么必须从技术上区分两个零的原因。

但是,+0 === -0计算结果为true。这是为什么 (…) ?

此行为在第11.9.6节 “ 严格平等比较算法”中 有明确定义(部分强调是我的):

比较x === y,其中xy是值,产生 truefalse 。这样的比较执行如下:

(…)

  • 如果Type(x)是Number,则

    1. 如果x为NaN,则返回false。
    2. 如果y为NaN,则返回false。
    3. 如果x与y相同,则返回true。
    4. 如果x为+ 0,y为−0,则返回true。
    5. 如果x为−0,y为+0,则返回true。
    6. 返回false。

(…)

+0 == -0顺便说一句也是如此。)

从逻辑上看+0-0应平等对待。否则,我们将不得不在我们的代码中考虑到这一点,而我个人不想这样做;)

注意:

ES2015引入了一种新的比较方法Object.isObject.is明确区分-0+0

Object.is(-0, +0); // false


 类似资料:
  • 问题内容: 事实证明,计算结果为,尽管和是 不同的 实体。那么,您如何与? 有一个hack: 我可以做得更好吗? 问题答案: 在ECMAScript6中,除了区分正零和负零并计算为之外,其行为类似于。 Chrome 24支持。

  • 问题内容: 这两个陈述是否相等? 问题答案: 否。最明显的区别是抛出(已检查)。在实践中,效果可能几乎相同,但完全取决于实现。 我敢打赌,在连续做各一百万次将采取 很多 更长的睡眠(),因为系统计时器粒度可能经常导致它实际上是一段不可忽略量的睡眠。

  • 问题内容: 我必须编写一个例程,如果变量的类型为,则将变量的值加1,否则将变量的值分配为0,其中变量的初始值为或。 第一个实现是因为我认为没有数字会使算术表达式为假,但是由于计算为真,所以这是错误的。然后,我得知行为类似于0,并且以下表达式均被评估为true。 当然不是0。被评估为false。这使看似重言式的表达成为错误。 为什么实际上不是0,却像0? 问题答案: 您真正的问题似乎是: 为什么:

  • 问题内容: 如果是这样,它是否有效地弃用了该财产? 问题答案: 这是来自各种答案的经过验证的信息的汇总。 这些CSS属性实际上都是唯一的。除了使元素不可见之外,它们还具有以下附加效果: 折叠 元素通常会占用的空间 响应 事件 (例如,单击,按键) 在参与 的TabOrder

  • 问题内容: 我有一个运行jenkins服务器的Linux机器,并从git中提取脚本并开始执行 我有一台Windows pc,从中打开jenkins网址说xyz:8080并尝试从Windows框中执行脚本,但是它给出了以下错误。 使用phantomjs运行时也会发生同样的情况。 我现在正在尝试在Firefox中运行 PCDriver类别: Pom.xml Jenkins Maven配置屏幕快照链接:

  • 问题内容: 抛出异常是否表明数组大于索引?如果不是,那是什么意思,为什么?我该如何纠正? 线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:在jumpyear.LeapYear.main(LeapYear.java:13)时为0 问题答案: 该数组不包含任何元素- 它是一个空数组。因此,当您要求数组中的第一个元素(索引中包含的元素)时,数组会说“索