3分钟搞定 isNaN() & Number.isNaN()

505 阅读1分钟

在ES6之前,我们常用 isNaN 判断一个值是否为NaN;

ES6之后, Number 构造函数也添加了 isNaN 静态方法,它首先判断一个值是否是number类型,再判断该值是否为NaN;

polyfill
isNaN = function(value) {
    var n = Number(value);//此处对参数进行强制类型转换
    return n !== n;
};

Number.isNaN = function(value) {
    return value !== value;
};
//第二种写法 
Number.isNaN = function(value) {
    return typeof value === 'number' && isNaN(value);
};
结论

Number.isNaN 只有在参数为NaN或者表达式计算结果为NaN时返回true:

Number.isNaN(NaN); //true
Number.isNaN(Number.NaN); //true
Number.isNaN(0 / 0); //true
Number.isNaN((() => NaN)()); //true

对于类型转换后等于NaN的值,isNaNNumber.isNaN 会输出不同的结果:

isNaN({}); //true
Number.isNaN({}); //false

isNaN(undefined); //true
Number.isNaN(undefined); //false

isNaN('teststring'); //true
Number.isNaN('teststring'); //false

相比之下, Number.isNaN 对于NaN值的判断会更加严格。

最后的小测试:

console.log(isNaN(),Number.isNaN()) //???