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


在JavaScript的數字類型Number中,我們最常使用的大概是整數類型與浮點數類型,但除這兩者外,還有個特殊的存在NaN,為什么NaN!==NaN?我們如何判斷一個值是否等於NaN呢?這篇文章好好聊聊NaN。

1.NaN是什么?

NaN全稱是Not-A-Number(不是一個數字),我們可以通過Number.NaN來獲得一個NaN,在類型轉換失敗時,我們常常會得到一個NaN,需要注意的是,NaN是JS中唯一一個自身不相等的存在。

Number.NaN //NaN
NaN === NaN //false

2.為什么NaN!==NaN?

NaN只是Number上的一個靜態屬性。

Number('echo') //NaN

比如Number('echo')會得到NaN,它只是為了告訴你這個值不是一個數字,一種表示方法,而非一個精准有效的值,因此NaN不能參與計算,也無法與自身比較。

3.什么情況下產生NaN

當Number提供的類型轉換方法在解析一個值卻無法返回數字時:

Number('echo') //NaN

parseInt('echo123') //NaN
parseInt('123echo') //123

parseFloat('時間跳躍123.1') //NaN
parseFloat('123.1時間跳躍') //123.1

計算中使用-  /   *運算符,參與計算的值轉換類型失敗時:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM