[JS] NaN (Not a Number)
NaN(Not a Number) 顧名思義就是非數字
NaN的型別是 Number:typeof NaN // NumberNaN不等於任何值,也不等於自己NaN === NaN // false
typeof NaN; // number
NaN === NaN; // false
NaN 的場景
在這些情況下會出現 NaN:
- 運算元無法被轉為 Number
- 0 除以 0
- 負數的平方根
- 對
Infinity做「除法」或「減法」運算:因為Infinity本身為大到無法表示的值,因此針對Infinity做加減乘除是沒有意義的Infinity + Infinity=> 回傳 InfinityInfinity - Infinity=> 回傳 NaNInfinity * Infinity=> 回傳 InfinityInfinity / Infinity=> 回傳 NaN
- 運算元為
NaN
// 運算元無法被轉為 Number
Number('hello'); // NaN
Number(undefined); // NaN
5 + undefined; // NaN
// 0 除以 0
0 / 0; // NaN
// 負數的平方根
Math.sqrt(-3); // NaN
// 對 Infinity 做除法或減法運算
Infinity / Infinity; // NaN
Infinity - Infinity; // NaN
// 運算元為 NaN
NaN + 1; // NaN
NaN - 2; // NaN
NaN * 3; // NaN
NaN / 4; // NaN
如何偵測變數中的資料是 NaN
可以透過以下兩種方法來偵測資料是否為 NaN:
Number.isNaN()
當 value 為 NaN、String 或 Object 時,會回傳 true。
Number.isNaN(value);
Number.isNaN(NaN); // true
Number.isNaN('String'); // true
Number.isNaN({}); // true
Number.isNaN 與 global isNaN 的差異
29.1 Use
Number.isNaNinstead of globalisNaN.
使用 isNaN 一開始會做 Number() 的數值轉換,假如遇到的是空字串或 Boolean 很可能會因為先做數值轉換的關係產生非預期的最終結果。因此建議使用 Number.isNaN() (不會進行 Number() 的數值轉換)的方式來進行判斷。
// bad
isNaN('1.2'); // false,Number('1.2') 轉換成數字 1.2
isNaN('1.2.3'); // true,Number('1.2.2') 無法轉換,回傳 NaN
// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true
利用 NaN 不等於任何值(包括本身)的特性
一般正常的變數自己等於自己一定會是 true,只有 NaN === NaN 會是 false。也就是說:
當一個變數自己等於自己是 false 的話,就可以推斷這個變數一定是 NaN 。
if (x !== x) {
} // 只有在 x 為 NaN 時,結果才為 true