JavaScript中的+0与-0

在JavaScript中其实存在两种零,+0-0,它们主要是符号位不相等一个为正,一个为负。在运算中它们也有很多不一样的地方。

那么我们如何得到+0-0呢?

1
2
0 * -1 // 0
0 * -1 // -0

可以看到0和负数进行运算时,我们就可以得到-0

-0在加减运算中不会有什么影响,但是在一些运算中就会影响我们的结果:

1
2
3
1/0 // Infinity
1/-0 // -Infinity
1/0 === -1/0 // false

我们对1分别除以+0-0时会得到+Infinity-Infinity,并且它们并不相等。

但是在将+0-0做字符串转换是我们会得到一样的结果:

1
2
3
4
5
6
var a = -0
var b = +0
a.toString() // 0
b.toString() // 0
JSON.stringify(a) // 0
JSON.stringify(b) // 0

在转换成字符串的过程我们都得到了字符串0,但是反过来我们又可以得到准确的结果:

1
2
Number.parseInt('-0') // -0
JSON.parse("-0") // -0

直接比较+0-0我们也无法得到正确的结果:

1
0 === -0 // true

一般我们有两种方法进行比较,一种就是利用 +Infinity-Infinity不相等的特点

1
2
3
4
5
function compareZero(v1,v2){
if(v1===0&&v2===0){
return 1/v1 === 1/v2
}
}

另一种是直接使用Object.is来进行判断:

1
Object.is(0,-0) // false

当然+0-0的存在也不是完全没有用处,我们有时会用符号位存储一些信息,比较向量或速度的方向信息,如速度-0,负号代表着运动的方向,保留了负号位可以防止这些信息的丢失。