在JavaScript中其实存在两种零,+0
与-0
,它们主要是符号位不相等一个为正,一个为负。在运算中它们也有很多不一样的地方。
那么我们如何得到+0
与-0
呢?
0 * -1 // 0
0 * -1 // -0
复制代码
可以看到0和负数进行运算时,我们就可以得到-0
。
-0
在加减运算中不会有什么影响,但是在一些运算中就会影响我们的结果:
1/0 // Infinity
1/-0 // -Infinity
1/0 === -1/0 // false
复制代码
我们对1分别除以+0
和-0
时会得到+Infinity
和-Infinity
,并且它们并不相等。
但是在将+0
和-0
做字符串转换时我们会得到一样的结果:
var a = -0
var b = +0
a.toString() // 0
b.toString() // 0
JSON.stringify(a) // 0
JSON.stringify(b) // 0
复制代码
在转换成字符串的过程中我们得到的都是字符串0
,但是反过来我们又可以得到准确的结果:
Number.parseInt('-0') // -0
JSON.parse("-0") // -0
复制代码
直接比较+0
与-0
我们也无法得到正确的结果:
0 === -0 // true
复制代码
一般我们有两种方法进行比较,一种就是利用 +Infinity
和-Infinity
不相等的特点
function compareZero(v1,v2){
if(v1===0&&v2===0){
return 1/v1 === 1/v2
}
}
复制代码
另一种是直接使用Object.is
来进行判断:
Object.is(0,-0) // false
复制代码
当然+0
与-0
的存在也不是完全没有用处,我们有时会用符号位存储一些信息,比较向量或速度的方向信息,如速度-0
,负号代表着运动的方向,保留了负号位可以防止这些信息的丢失。