NaN == NaN
orNaN === NaN
→ 都是回傳false
寫作業時遇到這問題,卡了許久,才發現有這種奇怪的現象,剛好當天就在同學的進度報告看到解法,感謝同學助手相救!
今天找時間來研究一下,原來要用 isNaN()
or Number.isNaN()
才能判斷,但這當中有更多奇葩特性,真是看得我吐了滿地血。
NaN
: 全名為 Not a Number ,屬於全域物件,代表不是數字
Math.sqrt(-1)
、或函式解析數字失敗parseInt("blabla")
後才會回傳。.isNaN(x)
: 判斷 x
是不是 NaN
的函式
x
轉換成數字類型 → .isNaN(Number(x))
,再進行比對是否為 NaN
Number.isNaN(x)
: 同樣也是判斷 x
是不是 NaN
的函式
.isNaN()
可靠又嚴格一點number
的 NaN
才回傳 true
( 意思是 'NaN'
不行喔!)false
.isNaN(x)
以下範例來自 MDN :
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(37); // false
// 字串
isNaN("37"); // false: "37" 轉換成數字的 37 後就不是 NaN 了
isNaN("37.37"); // false: "37.37" 轉換成數字的 37.37 後就不是 NaN 了
isNaN("123ABC"); // true: parseInt("123ABC") 是 123 但 Number("123ABC") 是 NaN
isNaN(""); // false: 空字串轉換成數字的 0 後就不是 NaN 了
isNaN(" "); // false: 有空白的字串轉換成數字的 0 後就不是 NaN 了
// 日期
isNaN(new Date()); // false
isNaN(new Date().toString()); // true
// 這個偵測的錯誤是不能完全信賴 isNaN 的理由
isNaN("blabla") // true: "blabla" 被轉換為數字,將其解析為數字失敗後回傳了 NaN
Number.isNaN(x)
以下範例來自 MDN :
// 只有這三種例子會回傳 true
Number.isNaN(NaN); // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0); // true
// 底下會回傳 false,但用 .isNaN() 會回傳 ture
Number.isNaN('NaN'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN('blabla'); // false
// 以下會回傳 false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN('37');
Number.isNaN('37.37');
Number.isNaN('');
Number.isNaN(' ');
讓我們搭著彼此的肩膀、同聲譴責:「 JavaScript ,你好靠杯 」
參考資料:
Written on May 3rd , 2019 by Yakim shu