What
首先了解一下NaN是什么?
NaN是一个全局对象的属性,表示“非数字”即Not-A-Number,初始值就是NaN,与Number.NaN的值相同。
同时,NaN属性是一个不可配置(configurable)、不可写(writable)、不可枚举(enumerable)的属性。
工作中一般不会直接用到NaN,多见于Math的返回值或是尝试将字符串解析为数字但是失败时。
Why
在我们需要判断值是否相等时,通常会使用下列四种方式判断:
if(param1 == param2) {
// do someting
}
if(param1 != param2) {
// do someting
}
if(param1 === param2) {
// do someting
}
if(param1 !== param2) {
// do someting
}
然而,这些方式对NaN都不适用。
1 === NaN; // false
'hello world' === NaN; // false
Number.NaN === NaN; // false
NaN === NaN; // false
因为无论你将NaN与什么值做比较,结果都会是false,哪怕是将NaN与自身作比较,结果依然是false。
How
那么要如何判断一个变量是不是NaN呢?
Js提供了两个函数来判断,Number.isNaN()与isNaN()
还有一种方式,鉴于NaN是目前唯一 一个不等于自身的值,所以我们还可以通过类似以下代码所示的方式判断变量“x”是不是一个NaN。
function isNaN(x) {
return x != x;
}
需要注意的是
isNaN()会先判断参数是不是Number类型,如果不是Number类型会尝试将这个参数转换为Numbe类型,之后再去判断是不是NaN。
而Number.isNaN()不会强制转换参数,只有在参数是NaN的时候才会返回true。
对于兼容性而言,Number.isNaN()是es6才加入的,不支持ie及部分低版本浏览器,isNaN支持几乎所有浏览器。