三、关于javascript中的NaN和isNaN()

本文章内容:

  • 什么是NaN以及产生NaN的场景
  • 关于isNan()方法

### NaN是什么?
NaN(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。
在javascript中,整数和浮点数统称为Number类型,除此之外Number类型还有一个特殊的值就是NaN,它是对象Number的一个静态属性,通过Number.NaN可以访问到。

NaN本身有两个非同寻常的特点:

  1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多不计算中可能会导致问题。
  2. 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, 是

  

 

posted @ 2019-10-18 20:15  悠扬小曲儿  阅读(329)  评论(0编辑  收藏  举报