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

ris*_*p89 7 javascript numbers operators zero

最近在http://wtfjs.com/上发表的一篇文章.作者在没有解释的情况下写下以下内容.

0 === -0 //returns true
Run Code Online (Sandbox Code Playgroud)

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

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

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

Col*_*son 6

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

var x = 0;
var y = 0;
var isTrue = (x === y);
document.write(isTrue); // true
Run Code Online (Sandbox Code Playgroud)

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

§5.2(第12页)

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


Ken*_*rey 5

实际上,即使在位级别,0和-0也不相同.但是,有一个特殊情况为+/- 0实现,所以他们比较相同.

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