前言
之所以会产生这样一个疑问,源于自己在工作中一个判别值为数字还是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