如果數值運算的操作數不是數字類型(或者無法解析為常規(guī)的十六進制或十進制數字),就無法返回一個有效的數字,這種情況下返回值為 NaN
NaN 是一個 “警戒值”(sentinel value, 有特殊通途的常規(guī)值),用于指出數字類型中的錯誤情況辨图,即“執(zhí)行數字運算沒有成功规揪,這是失敗后返回的返回”
let a = 2 / 'foo' // NaN
a == NaN // false
a === NaN // false
NaN 是一個特殊值悠轩,它和自身不相等档泽,是唯一一個非自反(自反音诫,reflexive惨奕,即 x === x 不成立)的值。而 NaN != NaN 為 true竭钝。
JavaScript 內部提供了 isNaN 來讓我們判斷它梨撞。
let a = 2 / 'foo'
isNaN(a) // true
然而操起起來并沒有那么容易,isNaN(...) 有一個嚴重的缺陷香罐,它的檢查方式過于死板卧波,就是“檢查參數是否不是NaN,也不是數字”庇茫。這樣做的結果并不太準確:
let a = 2 / 'foo'
let b = 'foo'
a // NaN
b // 'foo'
window.isNaN(a) //true
window.isNaN(b) // true
這個 bug 自 JavaScript 問世以來就一直存在港粱,至今已超過19年。
從 ES6 開始我們可以使用工具函數 Number.isNaN(...)
ES6 之前的瀏覽器的 polyfill:
if (!Number.isNaN) {
Number.isNaN = function(n) {
return {
typeof n === 'number' && window.isNaN(n)
}
}
}
實際上還有一個更簡單3的方法來判斷NaN,即利用 NaN 不等于自身的這個特點查坪。NaN 是 JavaScript 中唯一一個不等于自身的值寸宏。
if (!Number.isNaN) {
Number.isNaN = function(n) {
return n !== n
}
}