js中的NaN,isNaN與Number.isNaN的區別,如何判斷一個值嚴格等於NaN

在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

參考資料:

JavaScript中的 NaN 與 isNaN

MDN--NaN

MDN--isNaN

相關文章
相關標籤/搜索