NaN#
js中有一个特殊的对象:NaN,它表示一个非法的数字,即:Not a Number。
在js中她也是唯一一个不等于自身的变量,即:NaN !== NaN
NaN != NaN
window.isNaN#
window.isNaN在接收到参数后,会先把参数转化成数字A
(重点),然后再比较A !== A
,用代码可以表示为:
window.isNaN = function (value) {
var val = Number(value);
return val !== val;
}
由于中间存在一步将参数转化成数字的过程,所以最后结果会出现各种差异
例如:
// 以下结果为true的都是因为Number的值是NaN
isNaN(NaN); // true
isNaN({}); // true
isNaN(undefined); // true
isNaN('字符串'); // true
isNaN(['a']); // true
isNaN(['123a']); // true
// 以下结果为false,是因为她们可以被转化成数字
isNaN(null); // false
isNaN(''); // false
isNaN(true); // false
isNaN(false); // false
isNaN([]); // false
isNaN([1]); // false
isNaN(['1']); // false
isNaN(new Date()); // false
Number.isNaN#
Number.isNaN是在es6中新增的方法,该方法就是用来参数是否是 NaN
这个值的。
例如:
Number.isNaN(NaN); // true
Number.isNaN(0 / 0); // false
Number.isNaN(Number.NaN); // false
Number.isNaN(true); // false
Number.isNaN(''); // false
Number.isNaN(123); // false
Number.isNaN(undefined); // false
Number.isNaN(null); // false
其实这个api判断的内容很简单,只要你传入的参数不是NaN
,那么结果都是false,否则为true。
由于这是es6的方法,在不支持的浏览器中,可以使用polyfill:
Number.isNaN = function(val) {
return val !== val;
}
// 或者
Number.isNaN = function(val) {
return (
typeof val === 'number' &&
window.isNaN(val)
)
};