你知道函数调用 isNaN(null) 的返回值吗?

1,230 阅读2分钟

前言

  之所以会产生这样一个疑问,源于自己在工作中一个判别值为数字还是null的场景。我想当然地认为,isNaN翻译过来就是“不是一个数字”嘛,那如果值不是数字的话,方法肯定就会返回true。然而运行结果狠狠地打了我的脸,isNaN(null)=false。不知道其他同学有跟我一样的理解的吗?

isNaN 的作用

  要想搞清楚,isNaN(null)=false的原因,首先我们需要知道isNaN()函数的作用。MDN上是这样解释的:isNaN()  函数用来确定一个值是否为NaN 。即isNaN()函数专门用于判断值是否为NaN这种类型。敲黑板啦,此处的NaN,在javascript中,可以理解为一种特定的数字类型,当算术运算(即加减乘除计算)返回一个未定义的或无法表示的值时,NaN就产生了。

isNaN 的工作原理

  isNaN()函数在判断一个值是否为NaN这种类型时,首先会利用Number()等函数,尝试将需要判断的数据转换为数值类型。所以:

isNaN(null)
//等价于:
isNaN(Number(null))

//因为:
Number(null)=0
//所以:
isNaN(null)=isNaN(0)=false

讲到这里,相信大家应该都能理解了。我们再列举一些其他情况,加深理解:

栗子

//因为Number(X)=NaN,所以isNaN(X)=true
isNaN(undefined); // true;
isNaN({});        // true
//因为Number(X)不等于NaN,所以isNaN(X)=false
isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false

// strings
isNaN("37");      // false: 可以被转换成数值37
isNaN("37.37");   // false: 可以被转换成数值37.37
isNaN("37,5");    // true
isNaN('123ABC');  // true:  parseInt("123ABC")的结果是 123, 但是Number("123ABC")结果是 NaN
isNaN("");        // false: 空字符串被转换成0
isNaN(" ");       // false: 包含空格的字符串被转换成0

// dates
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

isNaN("blabla")   // true: "blabla"不能转换成数值
                  // 转换成数值失败, 返回NaN

参考自

isNaN()