本文章内容:
- 什么是NaN以及产生NaN的场景
- 关于isNan()方法
### NaN是什么?
NaN(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数为返回数值的情况。
在javascript中,整数和浮点数统称为Number类型,除此之外Number类型还有一个特殊的值就是NaN,它是对象Number的一个静态属性,通过Number.NaN可以访问到。
NaN本身有两个非同寻常的特点:
- 任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多不计算中可能会导致问题。
- NaN与任何值都不相等,包括NaN本身。
#### 产生NaN的两个场景:
##### 1、表达式计算
一个表达式中有减号(-)、乘号(✖)、或除号(➗)等运算符时,JS引擎在计算之前会试图将表达式的每一项转化为Number类型,使用Number()做转换,如果转换失败则返回NaN。
100 - '1a'; // NaN '100' / '10a'; // NaN '10a' * 5; //NaN undefined - 1; //NaN ===> Number(undefined) NaN [] * 10; // 0, ====> Number([]) = 0 null - 5; // -5 ====> Number(null) = 0
##### 2、类型转换
直接使用parseInt、parseFloat或者Number讲一个给数字的值转化为数字时,表达式返回NaN.
'abc' - 1; // NaN parseInt('abc'); // NaN parseFloat('abc'); // NaN Number('abc'); //NaN
对于数字+字符的值,其转化结果会有不同。
Number('123abc'); // NaN
parseInt('123abc'); // 123
parseInt('123abc45'); // 123
parseFloat('123.45abc'); // 123.45
Number转化的是整个值而不是部分值,parseInt和parseFloat只转化第一个无效字符之前的字符串。另外,一元操作符也可以实现与Number相同的作用:
+'123abc'; // NaN +'123'; // 123 +'123.78'; // 123.78 +'abc'; // NaN
### isNaN()
isNaN()是一个全局方法,它的作用是差一个值是否能被Number()成功转换,如果能转换成功就返回false,否则返回true.
isNaN(NaN); // true 不能被Number()转换,所有结果为true isNaN('123'); // false 能被Number()成功转换,所以IsNaN函数最终返回false isNaN('123abc'); // true isNaN('123.45ab'); // true
由上可见,isNaN()方法并不能判断一个值是否为NaN,如果想判断某个值是否为NaN,可以利用NaN不等于自身的特殊性质:
function selfIsNaN(num) {
return value != value
}
但是,在es6中,Number对象上也提供了isNaN()方法,和全局isNaN()不同的是,它用于判断某个值本身是否为NaN,而不需要进行类型转换。用法如下:
Number.isNaN('123'); // false, 本身不是NaN
Number.isNaN('abc'); // false, 本身不是NaN
Number.isNaN(NaN); // true, 是