事情起源是这样的,我在做任务十五的时候对一个空气质量输入框输入的数字进行验证的时候,如果用户输入的不是一个整数,那么使用parseInt转换后的应该是NaN,所以有了下面的代码:
if(num == NaN){alert("空气质量指数必须为整数");}
num确实是NaN,但是上面的条件的结果是false,但是问题在哪呢?
console.log(NaN == NaN);//false
结果竟然是false,是没有严格等于吗?
console.log(NaN === NaN)//false
果然不是。
####NaN
全局属性 NaN 表示 Not-A-Number 的值,和 Number.NaN 的值一样。在现代浏览器中(ES5中), NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。
####NaN值的产生
当算术运算返回一个未定义的或无法表示的值时,NaN就产生了。但是,NaN并不一定用于表示某些值超出表示范围的情况。将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN。
例如,0 除以0会返回NaN —— 但是其他数除以0则不会返回NaN。
(O除以0 返回Infinity,Infinity 是一个数值,表示无穷大)
因为NaN不能通过相等操作符(== 和 ===)来判断 ,因为 NaN == NaN 和 NaN === NaN 都会返回 false。所以JavaScript提供了isNaN()来判断是否为NaN。
####isNaN()
传入参数为被检测的值。
早期版本的isNaN函数,如果你传入的参数不是Number类型,它会首先尝试将这个参数转换为数值,然后才会对转换后的结果是否是NaN进行判断。但是,isNaN还是有些问题。
比如字符串和布尔值会被强制转换为数值0或1,但是isNaN还是会返回false。
所以ES6里,有一个Number.isNaN() 方法提供可靠的NaN值检测。
当传入一个数字参数并调用 Number.isNaN 时,会进行以下几步:
- 如果Type(number) 不是数字, 返回 false.
- 如果数字是NaN, 返回true.
- 其他情况,返回false.
在 IEEE 754 定义的NaN标准,
“在计算中, NaN, 代表一个非数字, 是用来呈现未定义(undefined)和不可呈现(unrepresentable)的数据类型, 尤其是在浮点计算中。”
“与NaN的比较会一直返回一个无序的结果,甚至跟它自己比较。”
参考: