isNaN 與 Number.isNaN,兩個方法是不同的,NaN 是非數值資料的表示,而這兩個方法都是判斷資料是否非數值,isNaN 是比較早期的方法,所以有許多特別的特例
NaN
全域屬性 NaN 表示「非數值」(Not-A-Number)的數值。
NaN 的屬性屬於全域物件。
如同 Number.NaN 一般,NaN 的初始數值是「非數值」。在當今的瀏覽器中,NaN 屬性不可設定(non-configurable)也不可覆寫(non-writable)。雖然可能有例外,也請不要覆蓋它。
寫程式很少會直接動用 NaN。通常是在 Math 函式計算失敗(Math.sqrt(-1))或函式解析數字失敗(parseInt(“blabla”))後才會回傳。
isNaN
isNaN() 函式會判斷某個數值是不是 NaN。
注意:在 isNaN 函式裡面,有個有趣的強制性規則。你可能會想改用在 ECMAScript 6 導入的 Number.isNaN()、或是用 typeof 來判斷某個數值是不是「非數字」(Not-A-Number)。
1 2 3 4 5 6 7 8 9 10 11 12 13
| isNaN(123) isNaN(-1.23) isNaN(5-2) isNaN(0) isNaN('123') isNaN('Hello') isNaN('2005/12/12') isNaN('') isNaN(true) isNaN(undefined) isNaN('NaN') isNaN(NaN) isNaN(0 / 0)
|
Number.isNaN
Number.isNaN()方法確定傳遞的值是否為NaN和其類型是Number。它是原始的全局isNaN()的更強大的版本。
和全局函數isNaN()相比,該方法不會強制將參數轉換成數字,只有在參數是真正的數字類型,且值為NaN的時候才會返回true。
1 2 3 4 5 6 7 8 9 10 11 12 13
| Number.isNaN(123) Number.isNaN(-1.23) Number.isNaN(5-2) Number.isNaN(0) Number.isNaN('123') Number.isNaN('Hello') Number.isNaN('2005/12/12') Number.isNaN('') Number.isNaN(true) Number.isNaN(undefined) Number.isNaN('NaN') Number.isNaN(NaN) Number.isNaN(0 / 0)
|
isNaN vs Number.isNaN
由上述的定義說明得知,NaN 就是用來判斷是否數值,那為什麼要使用 isNaN(不管 isNaN 或 Number.isNaN) 來判斷?
因為在JavaScript中,NaN 最特殊的地方,就是與其他 JavaScript 的值不同,我們不能使用等號運算符(== 與 ===)來判斷某個值是不是 NaN,因為連
結果都是 false。
因此,必須要有一個判斷值是否是 NaN 的方法。以下列出比較特別的特例,以及 Number.isNaN 與 NaN 的對比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| 0/0 0/-0 0/+0 1/0 1/-0 'A' == NaN 'A' === NaN NaN === NaN
isNaN(NaN) isNaN('A') isNaN("NaN"); isNaN(undefined); isNaN({});
isNaN("blabla");
isNaN(true); isNaN(null); isNaN(37);
isNaN("37"); isNaN("37.37"); isNaN("123ABC"); isNaN(""); isNaN(" ");
isNaN(new Date()); isNaN(new Date().toString());
Number.isNaN(NaN) Number.isNaN(Number.NaN); Number.isNaN(0/0)
Number.isNaN('A') Number.isNaN("NaN"); Number.isNaN(undefined); Number.isNaN({}); Number.isNaN("blabla");
Number.isNaN(true); Number.isNaN(null); Number.isNaN(37); Number.isNaN("37"); Number.isNaN("37.37"); Number.isNaN(""); Number.isNaN(" ");
|
參考資料