博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端学习之JavaScript中的 NaN 与 isNaN
阅读量:4544 次
发布时间:2019-06-08

本文共 1929 字,大约阅读时间需要 6 分钟。

 

NaN

NaN 即 Not a Number ,不是一个数字。 在 JavaScript 中,整数和浮点数都统称为 Number 类型 。除此之外,Number 类型还有一个很特殊的值,即 NaN 。它是 Number 对象上的一个静态属性,可以通过 Number.NaN 来访问 。 

console.log(Number.NaN); // NaN

 

在 ECMAScript v1 和其后的版本中,还可以用预定义的全局属性 NaN 代替 Number.NaN 。

 

console.log(NaN); // NaN

 

 

 

在以下两种场景中,可能会产生 NaN 值 。

【1】表达式计算

一个表达式中如果有减号 (-)、乘号 (*) 或 除号 (/) 等运算符时,JS 引擎在计算之前,会试图将表达式的每个分项转化为 Number 类型(使用 Number(x) 做转换)。如果转换失败,表达式将返回 NaN 。

 

100 - '2a' ; // NaN'100' / '20a'; // NaN'20a' * 5 ; // NaNundefined - 1; // NaN, Number(undefined) == NaN[] * 20 ; // 0, Number([]) == 0null - 5; // -5, Number(null) == 0

 

而 加号 (+) 不会将其两边的变量转化为 Number 类型,这是因为JS表达式的执行顺序是按照运算符的优先级从左到右依次进行的,如果加号 (+) 两边的变量都是 Number 类型时,才会做数字相加运算,如果其中有一个变量是字符串,则会将两边都作为字符串相加。

5 + 4 + '6' = '96';1 + '2' + 3 =  '123'

 

【2】类型转换

直接使用 parseInt,parseFloat 或 Number 将一个非数字的值转化为数字时,表达式返回 NaN 。

'abc' - 3   // NaNparseInt('abc')  // NaNparseFloat('abc') // NaNNumber('abc')    // NaN

 

对于 数字+字符 的值,其转化结果会有所不同:

Number('123abc'); // NaNparseInt('123abc'); // 123parseInt('123abc45'); // 123parseFloat('123.45abc');// 123.45

 

Number 转换的是整个值,而不是部分值;parseInt 和 parseFloat 只转化第一个无效字符之前的字符串。 另外,一元加操作符也可以实现与 Number 相同的作用。 

+ '12abc'; // NaN+ '123'; // 123+ '123.78'; // 123.78+ 'abc'; // NaN

 

因此,当一个字符串不能被 Number、parseInt 或 parseFloat 成功转换时,就返回 NaN,表示该字符串无法被识别为数字类型,这是一个异常状态,并不是一个确切的值。 

 

isNaN

isNaN() 是一个全局方法,它的作用是检查一个值是否能被 Number() 成功转换 。 如果能转换成功,就返回 false,否则返回 true 。

isNaN(NaN)    // true 不能转换isNaN('123')   // false 能转换isNaN('abc')    // true 不能转换isNaN('123ab')   // true 不能转换isNaN('123.45abc') // true 不能转换

 

可以看出,isNaN() 没有办法判断某个值本身是否为 NaN 。如果想要知道某个值本身是否为 NaN,可以利用 NaN 不等于自身 这一特性来判断。

function selfIsNaN(value){    return value !== value}

 

另外,ES6 在 Number 对象上也提供了 isNaN()  方法,和全局方法 isNaN() 不同的是,它用于判断某个值本身是否为 NaN,而不需要进行类型转换。

Number.isNaN('123'); // false 本身不是NaNNumber.isNaN('abc'); // false 本身不是NaNNumber.isNaN(NaN); // true 本身是NaN

 

原创发布 @  2016 博客园 

 

【参考资料】

[1] 

 

 

转载于:https://www.cnblogs.com/JetpropelledSnake/p/9114396.html

你可能感兴趣的文章
C#读写socket的常用方式
查看>>
c语言链表fwrite二进制保存,读取时出现 屯 的问题
查看>>
谷歌Cartographer学习(1)-快速安装测试(转载)
查看>>
lib32gcc1 : Depends: gcc-4.9-base (= 4.9-20140406-0ubuntu1) but 4.9.3-0ubuntu4
查看>>
简单的将字符串转换成日期对象格式
查看>>
HTC G7 搜索和感光按键修改
查看>>
Dll注入经典方法完整版
查看>>
在非主线程中创建窗口
查看>>
查看selenium api的方法
查看>>
移植opencv2.4.2到tiny6410
查看>>
14种植物放入室内的奇异功效,为自己的健康而转
查看>>
全功能Python测试框架:pytest
查看>>
sed程序
查看>>
Hdu 1856(离散化+并查集)More is better
查看>>
SQLite
查看>>
在Windows下用gSoap实现简单加法实例
查看>>
小小知识点(二十五)5G关键技术——Massive MIMO(大规模天线阵列)和beamforming(波束成形)...
查看>>
『Collections』namedtuple_具名元组
查看>>
jquery.pagination.js分页插件的运用
查看>>
Windows Phone 7 创建自定义的控件
查看>>