美文网首页
原生JS篇四、关于javascript中的NaN和isNaN()

原生JS篇四、关于javascript中的NaN和isNaN()

作者: 悠扬小曲儿 | 来源:发表于2019-10-18 20:14 被阅读0次

本文章内容:

  • 什么是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, 是

相关文章

网友评论

      本文标题:原生JS篇四、关于javascript中的NaN和isNaN()

      本文链接:https://www.haomeiwen.com/subject/vtuwmctx.html