JS中的NaN是什么?如何檢測?

nan是JS中表示“非數(shù)字”的特殊值,類型為number但不等于自身,判斷時需注意:1. 使用isnan()可能誤判因轉(zhuǎn)換問題;2. 推薦使用es6的number.isnan()精準判斷;3. 也可利用nan不等于自身的特性通過value !== value檢測。

JS中的NaN是什么?如何檢測?

在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這兩個方法就夠了。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享