为什么是;0==-0";JavaScript中是否为真?

为什么是;0==-0";JavaScript中是否为真?,javascript,numbers,operators,zero,Javascript,Numbers,Operators,Zero,在最近的一篇文章中。作者在没有解释的情况下写了以下内容,这恰好是真的 0 === -0 //returns true 我对===运算符的理解是,如果操作数指向同一对象,则返回true 此外,-运算符还返回对操作数负值的引用。使用此规则时,0和-0不应相同 那么,为什么0==-0?===并不总是指指向同一个对象。它在对象上进行比较,但在值类型上比较值。因此,这是如何工作的: var x = 0; var y = 0; var isTrue = (x === y); document.write(

在最近的一篇文章中。作者在没有解释的情况下写了以下内容,这恰好是真的

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

此外,-运算符还返回对操作数负值的引用。使用此规则时,0和-0不应相同


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

===
并不总是指指向同一个对象。它在对象上进行比较,但在值类型上比较值。因此,这是如何工作的:

var x = 0;
var y = 0;
var isTrue = (x === y);
document.write(isTrue); // true
JavaScript使用IEEE浮点标准,其中0和-0是两个不同的数字,但是,解析器必须将0和-0解释为相同的状态:

§5.2(第12页)

数学运算,如加法、减法、求反、乘法、除法以及本条后面定义的数学函数,应始终理解为计算数学实数的精确数学结果,不包含无穷大且不包含区别于正零的负零。本标准中的算法模型浮点算法包括显式 必要时,处理无穷大和有符号零以及执行舍入的步骤。如果将数学运算或函数应用于浮点数,则应将其理解为应用于该浮点数表示的精确数学值;这样的浮点数必须是有限的,如果它是+0或-0,那么相应的数学值就是0


事实上,0和-0即使在位级别上也不相同。但是,对于+/-0有一种特殊情况,因此它们的比较结果相同


===运算符在应用于基本数时按值进行比较。

基本数不是对象。您正在对数字进行值比较,而不是对对象进行身份比较

正零等于负零

这是来自
==
运算符的比较算法

如果类型(x)为数字,则

  • 如果x为NaN,则返回false

  • 如果y为NaN,则返回false

  • 如果x与y的数值相同,则返回true

  • 如果x为+0,y为−0,返回true。

  • 如果x是−0,y为+0,返回true。

  • 返回false


“它是一个补码,它们不一样,但在两个中它们是一样的。”科尔约翰逊我有一点忘记了两个补码。Javascript使用IEEE 64位浮点表示数字,这是一个人的补充。所以它似乎是用Javascript处理的特殊情况。没错。我也不认为这种特殊情况是特定于Javascript的。那么,这是一种用Javascript实现的特殊情况,还是用2的补码来计算负数?@hrishikeshp19 IEEE浮点标准是一种补码,除了这个。它不仅仅是解析器
a==-a
其中a为0时返回true.@colehonson Nice摘录(本身)。我没有意识到它对-0的处理如此直截了当。@pst我也没有意识到,直到我尝试在标准PDF中搜索
negative
以找到块+1。因为-0实际上是JavaScript中的一个数字(因为所有数字实际上都是IEEE-754浮点,可以表示负零)。它只是被定义为等于0,所以人们不会发疯。