上一篇我們認識了 JavaScript 的算術運算和運算子,知道怎麼用 +、-、*、/、% 來計算數字。
但有些計算的結果,沒辦法用一般的數字來表示。
比如:一個數字除以零,答案是什麼?「無窮大」減掉「無窮大」,結果又是什麼?
JavaScript 不會因為這些奇怪的計算就當機,而是會給你一些「特殊的數字值」來表示這些情況。
這篇文章會帶你認識 JavaScript 中的三個特殊數字值:Infinity、-Infinity 和 NaN。
Infinity 和 -Infinity:無限大與負無限大
還記得前一篇提到的嗎?JavaScript 用 64 個位元來儲存一個數字值。
但 64 個位元能表示的數字是有限的,總會有「大到放不下」的時候。
為了處理這種情況,JavaScript 在 64 位元的組合裡,特別保留了兩組位元排列,用來代表「超出範圍的大」和「超出範圍的小」:
Infinity:代表正無窮大-Infinity:代表負無窮大
它們跟 42、3.14 一樣,都是數字型態的資料值,一樣儲存在記憶體的 64 個位元裡。
只是它們代表的不是一個具體的數字,而是「這個數字已經大到(或小到)無法用正常方式表示了」。
什麼時候會碰到它們呢?
最常見的情況就是「除以零」:
1 / 0 // 得到 Infinity
-1 / 0 // 得到 -Infinity在數學裡,除以零是沒有定義的。
但 JavaScript 不會報錯,而是直接給你 Infinity,代表「這個結果大到沒有辦法用一般數字表示」。
對 Infinity 做計算會怎樣?
你可以對 Infinity 做加減乘除,但結果通常還是 Infinity:
Infinity + 1 // 還是 Infinity
Infinity + 1000 // 還是 Infinity
Infinity * 2 // 還是 Infinity這其實很合理——無限大加上任何數字,還是無限大。
不過,這也代表用 Infinity 來做計算是不可靠的。
因為不管你加多少、乘多少,結果都一樣,你根本無法從結果中得到有意義的資訊。
所以在實際寫程式的時候,如果你的計算結果出現了 Infinity,通常代表某個地方出了問題,而不是你真的在處理「無限大」。
NaN:不是數字的「數字」
除了 Infinity 和 -Infinity,JavaScript 在 64 位元的組合裡還保留了第三組特殊的位元排列:NaN。
NaN 是 Not a Number 的縮寫,意思是「不是一個數字」。
它跟 Infinity 一樣,是一個數字型態的資料值,儲存在 64 位元裡。
但它代表的意思不同——Infinity 是「數字大到放不下」,而 NaN 是「根本算不出一個有意義的數字」。
什麼時候會出現 NaN?
當你嘗試做一個「沒有意義的數字運算」時,JavaScript 就會給你 NaN:
0 / 0 // 得到 NaN
Infinity - Infinity // 得到 NaN
"hello" * 3 // 得到 NaN拿 0 / 0 來說——零除以零,在數學裡是沒有定義的,它不是 0,也不是 Infinity,根本沒有一個合理的答案。
JavaScript 遇到這種情況,就會用 NaN 來告訴你:「我算不出一個有意義的數字結果。」
NaN 最矛盾的地方
NaN 有一個很容易讓初學者困惑的地方:它的名字叫「不是數字」,但它的資料型態卻是數字。
typeof NaN // 得到 "number"這聽起來很矛盾,但你可以這樣理解:NaN 是 JavaScript 數字型態裡的一個特殊標記,專門用來表示「這次的計算失敗了,沒有產生有意義的數字結果」。
它之所以屬於數字型態,是因為它是從數字運算中產生的——只是這個結果恰好不是一個有意義的數字。
小結
讓我們整理一下這篇文章的重點:
- JavaScript 有三個特殊的數字值:
Infinity、-Infinity和NaN。 Infinity和-Infinity代表正負無限大,通常在除以零的時候出現。對Infinity做計算的結果不可靠,出現時通常代表程式邏輯有問題。NaN(Not a Number)代表「算不出有意義的數字結果」,像是0 / 0或Infinity - Infinity。NaN雖然叫「不是數字」,但它的資料型態是數字——因為它是從數字運算中產生的特殊標記。