在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的值,isNaN 和 Number.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()) //???