Js面试篇3、关于javascript中的NaN和isNaN()

本文章内容:javascript

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

NaN是什么?

NaN(Not a Number)是一个特殊的数值,这个数值用于表示一个原本要返回数值的操做数为返回数值的状况。 在javascript中,整数和浮点数统称为Number类型,除此以外Number类型还有一个特殊的值就是NaN,它是对象Number的一个静态属性,经过Number.NaN能够访问到。java

NaN自己有两个非同寻常的特色:es6

  1. 任何涉及NaN的操做(例如NaN/10)都会返回NaN,这个特色在多不计算中可能会致使问题。
  2. NaN与任何值都不相等,包括NaN自己。

产生NaN的两个场景:

一、表达式计算

一个表达式中有减号(-)、乘号(✖)、或除号(➗)等运算符时,JS引擎在计算以前会试图将表达式的每一项转化为Number类型,使用Number()作转换,若是转换失败则返回NaN。bash

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
复制代码
二、类型转换

直接使用parseInt、parseFloat或者Number讲一个给数字的值转化为数字时,表达式返回NaN.函数

'abc' - 1; // NaN
parseInt('abc'); // NaN
parseFloat('abc'); // NaN
Number('abc'); //NaN
复制代码

对于数字 + 字符的值,其转化结果会有不一样。ui

Number('123abc'); // NaN
parseInt('123abc'); // 123
parseInt('123abc45'); // 123
parseFloat('123.45abc'); // 123.45
复制代码

Number转化的是整个值而不是部分值,parseInt和parseFloat只转化第一个无效字符以前的字符串。另外,一元操做符也能够实现与Number相同的做用:spa

+'123abc'; // NaN
+'123'; // 123
+'123.78'; // 123.78
+'abc'; // NaN
复制代码

isNaN()

isNaN()是一个全局方法,它的做用是差一个值是否能被Number()成功转换,若是能转换成功就返回false,不然返回true.code

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,而不须要进行类型转换。用法以下:ip

Number.isNaN('123'); // false, 自己不是NaN
Number.isNaN('abc'); // false, 自己不是NaN
Number.isNaN(NaN); // true, 是
复制代码
相关文章
相关标签/搜索