Javascript中的0和-0有区别吗?

7
在JavaScript中,当你乘法运算时,1 * 0 = 0,而-1 * 0 = -0。我可以理解它们在技术上是相同的,但是它们在底层有所不同吗?

2
是的,这就是浮点数表示方法,并且是为什么最好避免使用 float === float 的原因。 - Keith
2
在数学上它们是相等的,但在二进制中它们的表示方式不同。具体来说,对于-0,第一位是1而不是0。 - Rick
3个回答

6
有趣!它们看起来相等——没有一个比另一个大,但它们是不同的对象,并具有多个副作用(包括根据Roisin的答案除以0-0)。
观察到其他有趣的怪异现象:
const a = 0;
const b = -0;

a == b; // true
a === b; // true

a < b; // false
b < a; // false

Object.is(a, b); // false
Object.is(a, -b); // true

b.toString(); // "0" <-- loses the negative sign

a + b; // 0
b - a; // -0
a * b; // -0


1
这取决于您使用的相等比较。例如,Object.is(+0, -0) === false 是正确的。 - Róisín Grannell
2
在JS中,==和===对待有符号和无符号0是相同的。这在许多(大多数?)遵循IEEE-754模型的语言中都是标准的,通常需要不同的方法来检测。 - user2864740
这样做也符合 x <= 0,x >= 0,x <= -0 和 x >= -0 的统一性。(不考虑适当比较方法的争议。) - user2864740

5

是的,它们有所不同。JavaScript拥有带符号的零,因此在内部表示时两者是不同的。

还有一些实际上的区别:

console.log(1 / +0 ===  Infinity) // true
console.log(1 / -0 === -Infinity) // true

0

当你比较 0 === -0 时,会得到 true,但如果你使用 Object.is(0, -0) 进行检查,会得到 false

Object.is()


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