1.問題
在FreeCodeCamp上碰到這樣一道題:
刪除數組中的所有假值。
在JavaScript中,假值有false、null、0、”“、undefined 和 NaN。
false、null、0、”“、undefined都很好判斷,直接使用===即可
但是NaN是不能使用===的
> NaN === NaN;
false //永遠返回false
如果不能使用 === 來檢測NaN,那該使用什麼呢?
2.isNaN函數(存在問題)
JS中有一個全局函數isNaN(),但這個函數有一個問題,它總會隱式的將參數中的值轉換成數字再做判斷,這樣就在判斷很多明顯不是NaN的值的時候也返回了true:
> isNaN("foo")
true
任意的字符串使用isNaN都會返回true,這樣就無法判斷真正的isNaN了
3.解決方案
- 利用NaN是唯一一個與自身嚴格不相等的值:
function myIsNaN(value) {
return value !== value;
}
- 在使用isNaN()之前先檢查一下這個值是不是數字類型,這樣就避免了隱式轉換的問題:
function myIsNaN2(value) {
return typeof value === 'number' && isNaN(value);
}