nan是JS中表示“非數(shù)字”的特殊值,類型為number但不等于自身,判斷時需注意:1. 使用isnan()可能誤判因轉(zhuǎn)換問題;2. 推薦使用es6的number.isnan()精準判斷;3. 也可利用nan不等于自身的特性通過value !== value檢測。
在JS中,NaN表示“Not a Number”,通常出現(xiàn)在數(shù)學運算結(jié)果無法得到一個有效數(shù)字時。比如你用字符串減去數(shù)字、除以0、或者做了一些非法的數(shù)學操作,都可能得到NaN。
雖然它叫“Not a Number”,但它的類型仍然是number,這是JS設(shè)計上的一個歷史遺留問題,所以別被名字和類型搞混了。
NaN的特性:不是自己
最讓人頭疼的一點是,NaN有一個特殊的行為:它不等于自己。
NaN === NaN // false
這也是為什么不能直接用===來判斷一個值是不是NaN。
常見的檢測方法
1. 使用 isNaN()
這是最老的方法:
isNaN(NaN) // true isNaN('abc') // true(注意!)
但有個大坑:isNaN()會先嘗試把參數(shù)轉(zhuǎn)換成數(shù)字,如果轉(zhuǎn)換失敗才返回true。例如字符串’abc’會被認為是NaN,這可能導致誤判。
2. 使用 Number.isNaN()
ES6引入了更準確的判斷方式:
Number.isNaN(NaN) // true Number.isNaN('abc') // false
這個方法不會對參數(shù)做強制轉(zhuǎn)換,只有當值本身就是NaN時才會返回true,推薦優(yōu)先使用這種方式。
3. 利用 NaN !== NaN
因為NaN是唯一一個不等于自己的值,可以利用這點:
function isNan(value) { return value !== value; }
雖然看起來有點奇怪,但這招確實好使,而且兼容性很好。
實際應用中的建議
- 如果你想判斷某個變量是否真的是NaN,優(yōu)先使用 Number.isNaN()
- 如果你要判斷一個表達式的結(jié)果是否無效,比如函數(shù)返回的是不是非數(shù)字,可以用上面幾種方法組合使用
- 注意處理從用戶輸入或接口獲取的數(shù)據(jù),避免因類型錯誤導致誤判
基本上就這些。總結(jié)來說,NaN是個特殊的值,判斷它不能靠常規(guī)手段,記住Number.isNaN()和value !== value這兩個方法就夠了。