1. window.isNaN()
(1) window.isNaN(NaN) // true
(2) window.isNaN(123) // false
注意: window.isNaN 只對數值有效,如果傳入其他值,會被先轉成數值。比如,傳入字符串的時候,字符串會被先轉成NaN,所以最後返回true,這一點要特別引起注意。也就是說,isNaN爲true的值,有可能不是NaN,而是一個字符串。(不是數值會先調用 Number 方法轉化爲數值)
window.isNaN('Hello') // true
//相當於
window.isNaN(Number('Hello')) // true
2. 先判斷是不是數字,然後再使用 window.isNaN()
function judgeNaN (value) {
return (typeof value) === 'number' && window.isNaN(value);
}
judgeNaN(1) //false
judgeNaN(NaN) //true
judgeNaN("我是字符串") //false
judgeNaN([]) //false
judgeNaN({}) //false
3. Number.isNaN(value) ( 1. 首先判斷 value 類型是不是 number; 2. 然後判斷 value 是不是 NaN)
Number.isNaN(NaN); // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0/0); // true
// 下面這些使用 window.isNaN() 將會返回 true ,Number.isNaN() 返回 false,
// 因爲 window.isNaN 會先把參數轉化爲數字類型,再判斷是不是 NaN; 而 Number.isNaN 會先判斷參數是不是數字類型,不是就返回 false, 是數字類型再進入判斷是不是 NaN.
Number.isNaN('NaN'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN('blabla'); // false
// 下面這些 window.isNaN() 和 Number.isNaN() 都返回 false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN('37');
Number.isNaN('37.37');
Number.isNaN('');
Number.isNaN(' ')
補充: 不支持 Number.isNaN() 的老瀏覽器解決辦法
方法1 :
Number.isNaN = Number.isNaN || function(value {
return (typeof value) === 'number' && window. isNaN(value);
}
方法2 :
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
4. 利用 NaN 是 JavaScript 之中唯一不等於自身的值 (最簡單的辦法)
function judgeNaN (value) {
return value !== value;
}
judgeNaN(1) //false
judgeNaN(NaN) //true
judgeNaN( "我是字符串" ) //false
judgeNaN([]) //false
judgeNaN({}) //false
5.補充知識: Object.is() 是 ES6 用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行爲基本一致。除了對 +0 和 -0 以及 NaN 的判斷
NaN === NaN //false
Object.is(NaN, NaN) //true
+0 === -0 //true
Object.is(+0, -0) //false