为什么在JavaScript中 "0 === -0" 为真?

7
在最近一篇关于it技术的文章中,作者在没有任何解释的情况下写道:在http://wtfjs.com/网站上发表的内容是真实的。
0 === -0 //returns true

我对 === 运算符的理解是,如果操作数指向同一对象,则返回 true。

此外,减号运算符返回操作数负值的引用。根据这个规则,0 和 -0 不应该相同。

那么,为什么 0 === -0 呢?

3个回答

7

===并不总是指向相同的对象。它适用于对象,但对于值类型,它比较其值。因此,它的工作原理如下:

var x = 0;
var y = 0;
var isTrue = (x === y);
document.write(isTrue); // true

JavaScript使用IEEE浮点标准,其中0和-0是两个不同的数字,然而,ECMAScript标准规定解析器必须将0和-0解释为相同的数字:

§5.2(第12页)

数学运算,例如加法、减法、取负、乘法、除法以及稍后在此条款中定义的数学函数,应始终被理解为在数学实数上计算精确的数学结果,这些结果不包括无穷大和不包括区分正零和负零的负零。本标准中模拟浮点运算的算法包括必要时采取明确的步骤来处理无穷大和符号零并进行舍入。如果将数学运算或函数应用于浮点数,则应理解为应用于该浮点数所表示的精确数学值;这样的浮点数必须是有限的,并且如果它是+0或-0,则相应的数学值简单地为0


那么,这是 JavaScript 中实现的特殊情况还是负数使用二进制补码进行评估? - hrishikeshp19
@hrishikeshp19 IEEE浮点标准是补码,但有一个例外。 - Cole Tobin
@pst 直到我尝试在标准 PDF 中搜索“negative”以找到该块,才发现这一点。 - Cole Tobin
我认为你过分强调0和-0之间的相似之处。它们是不同的数字。你可以通过检查1 / 01 / -0 的结果来证明它们的差异。 - Kendall Frey
@KendallFrey 我只是在说标准规定它们是相同的,我承认它们是两个不同的数字。 - Cole Tobin
显示剩余2条评论

6

实际上,即使在位级别上,0和-0也不相同。但是,对于+/- 0,实现了一种特殊情况,使它们比较相等。

当应用于原始数字时,===运算符按值进行比较。


在一的补码中它们不相同,但在二的补码中它们是相同的。 - Cole Tobin
@ColeJohnson 我有一段时间忘记了二进制补码。Javascript使用IEEE 64位浮点数表示数字,这是一种一进制补码。 - Kendall Frey
所以看起来JavaScript处理了特殊情况。 - hrishikeshp19
没错。我认为这种特殊情况也不仅限于Javascript。 - Kendall Frey

3
原始数字不是对象。你正在比较数字的值,而不是对象的身份。
正零等于负零。
这来自于“===”运算符的比较算法
如果Type(x)是Number,则:
- 如果x为NaN,则返回false。 - 如果y为NaN,则返回false。 - 如果x与y具有相同的Number值,则返回true。 - 如果x为+0且y为-0,则返回true。 - 如果x为-0且y为+0,则返回true。 - 返回false。

2
+1。因为在JavaScript中,-0实际上是一个数字(由于所有数字都是IEEE-754浮点数,可以表示负零)。它只是被定义为等于0,以便人们不会疯狂。 - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接