JavaScript中的+0與-0

紫菜薹同學發表於2019-04-04

在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,負號代表著運動的方向,保留了負號位可以防止這些資訊的丟失。

相關文章