如何判断一个变量是不是非数字(NaN)

868 阅读1分钟

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支持几乎所有浏览器。