在JavaScript的數字類型Number中,咱們最常使用的大概是整數類型與浮點數類型,但除這二者外,還有個特殊的存在NaN,爲何NaN!==NaN?咱們如何判斷一個值是否等於NaN呢?這篇文章好好聊聊NaN。html
1.NaN是什麼?spa
NaN全稱是Not-A-Number(不是一個數字),咱們能夠經過Number.NaN來得到一個NaN,在類型轉換失敗時,咱們經常會獲得一個NaN,須要注意的是,NaN是JS中惟一一個自身不相等的存在。code
Number.NaN //NaN NaN === NaN //false
2.爲何NaN!==NaN?htm
NaN只是Number上的一個靜態屬性。blog
Number('echo') //NaN
好比Number('echo')會獲得NaN,它只是爲了告訴你這個值不是一個數字,一種表示方法,而非一個精準有效的值,所以NaN不能參與計算,也沒法與自身比較。ip
3.什麼狀況下產生NaN字符串
當Number提供的類型轉換方法在解析一個值卻沒法返回數字時:get
Number('echo') //NaN parseInt('echo123') //NaN parseInt('123echo') //123 parseFloat('時間跳躍123.1') //NaN parseFloat('123.1時間跳躍') //123.1
計算中使用- / *運算符,參與計算的值轉換類型失敗時:class
1 - '聽風是風' //NaN 1 * '123時間跳躍' //NaN 1 / 'echo123' //NaN
特別注意,兩個數字0相除也會獲得NaN:方法
0 / 0 //NaN
4.isNaN方法的含義,如何判斷一個值嚴格等於NaN
window上有一個全局方法isNaN(),可能大分部人習慣理解此方法爲判斷一個值是等於NaN,這是由於is NaN直譯就是「是否是NaN」所帶來的誤解,其實本意不是這樣:
isNaN(123) //false isNaN('123時間跳躍') //true isNaN(NaN) //true
當咱們向isNaN傳遞一個參數,它的本意是經過Number()方法嘗試轉換參數的類型爲Number,若是轉換成功返回false,不然轉返回true,它只是判斷這個參數可否轉成數字而已,並非判斷是否嚴格等於NaN。
因此當你要判斷某個值是否嚴格等於NaN時沒法使用isNaN()方法,畢竟你傳遞任意字符串它都會返回true。
ES6中提供了一個Number.isNaN()方法用於判斷一個值是否嚴格等於NaN:
Number.isNaN(NaN)//true
與isNaN最大的區別是,Number.isNaN不存在轉換類型的行爲,這點是最大的不一樣:
isNaN(NaN) //true Number.isNaN(NaN) //true isNaN('聽風是風') //true Number.isNaN('聽風是風') //false
咱們在前面說過,NaN是惟一一個與自身不相等的特殊值,若是你以爲Number.isNaN存在兼容問題,也能夠利用這個特色本身定義驗證方法:
const ISNAN = (value) => value !== value; ISNAN('聽風是風'); //false ISNAN(123); //false ISNAN(NaN); //true
參考資料: