热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中的NaN

什么是NaN什么时候会返回NaN判断NaN参考什么是NaN在MDN的NaN文章中有描述:全局属性NaN表示Not-A-Number的值。
  1. 什么是 NaN
  2. 什么时候会返回 NaN
  3. 判断 NaN
  4. 参考

什么是 NaN

在 MDN 的 NaN 文章中有描述:

  • 全局属性 NaN 表示 Not-A-Number 的值。
  • NaN 是一个全局对象的属性。
  • NaN 属性的初始值就是 NaN,和 Number.NaN 的值一样。
  • 在 ES5 中, NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。但在 ES3 中,这个属性的值是可以被更改的,但是也应该避免覆盖。
  • 通常都是在计算失败时,作为 Math 的某个方法的返回值出现的(例如:Math.sqrt(-1))或者尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("blabla"))。

NaN 的类型

typeof NaN   // "number"

也就是说 NaN 是一种特殊的 Number 类型值。

什么时候会返回 NaN

Javascript 权威指南 中『3.1.3 Javascript 中的算数运算』章节里有描述:

无穷大除以无穷大、给任意负数做开方运算 或者 算数运算符与不是数字或无法转换为数字的操作数一起使用时都将返回 NaN

可分开解释为以下等情况:

  • 无穷大除以无穷大
  • 给任意负数做开方运算
  • 算数运算符与不是数字或无法转换为数字的操作数一起使用
  • 字符串解析成数字

以下结果都是 NaN

Infinity / Infinity;   // 无穷大除以无穷大
Math.sqrt(-1);         // 给任意负数做开方运算
'a' - 1;               // 算数运算符与不是数字或无法转换为数字的操作数一起使用
'a' * 1;
'a' / 1;
parseInt('a');         // 字符串解析成数字
parseFloat('a');

这里的『无法转换为数字的操作』又是什么鬼?

先看下面可以转换为数字的操作例子:

Math.sqrt('4');        // 2
2 * '2';               // 4
'4' / 2;               // 2

无法转换为数字的操作

这里涉及到 Javascript 的 类型转换 的概念。

Javascript 权威指南 『3.8 类型转换』章节有描述:

如果 Javascript 期望使用一个数字,它把给定的值将转换为数字(如果转换结果无意义的话将返回 NaN)。

可以使用 Number() 方法做显式类型转换,举例:

Number('1');           // 1
Number(null);          // 0
Number('a');           // NaN

也可以使用一元运算符 + 做隐式转换,举例:

+'1';                  // 1
+null;                 // 0
+'a';                  // NaN

也可以使用全局函数 parseInt()parseFloat() 解析整数和浮点数,举例:

parseInt('12');        // 12
parseInt('12a');       // 12
parseInt('a12');       // NaN
parseInt(null);        // NaN

parseInt()parseFloat() 可以简单理解为:

尽可能解析更多数值字符,并且忽略后面的内容;如果第一个非空格字符是非数字,则会返回 NaN

需要注意的是 Number()parseInt()``parseFloat() ,对某些输入值的处理不同,如 null

非数字类型转换 为 数字类型,如下表汇总:

数字
undefinedNaN
null0
true1
false0
"" (空字符串)0
"1.2" (非空,数字)1.2
"one" (非空,非数字)NaN
[] (任意对象)0
[9] (一个数字元素)9
['a'] (其他数组)NaN
function(){} (任意函数)NaN

如何判断 NaN

首先全局的 isNaN() 函数不能严格判断输入值是否为 NaN

isNaN() 的怪异行为

在 MDN 的 isNaN() 文章中对 非数值参数 所表现的『怪异行为』有解释:

它会先尝试将这个参数转换为数值,然后才会对转换后的结果是否是 NaN 进行判断。

因此,对于能被强制转换为有效的非 NaN 数值来说,返回 false 值也许会让人感觉莫名其妙。

如下例子:

isNaN('37');      // false: 可以被转换成数值 37
isNaN('');        // false: 空字符串被转换成 0

严格判断 NaN

参考 MDN 中 Number.isNaN() 的 Polyfill 代码:

typeof value === 'number' && isNaN(value)

推荐教程:《JS教程》

以上就是Javascript 中的 NaN的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 本文深入解析了唐代诗人张籍的《牧童词》,不仅提供了诗歌的译文,还对其背后的社会政治背景进行了探讨。 ... [详细]
  • 本文介绍了如何使用Maven命令对Spring Boot项目中的子模块进行独立打包,包括依赖树的查看、项目的运行和打包等基本操作。 ... [详细]
  • 深入理解异步多线程编程模型
    现代计算机系统中的CPU通过并行处理提高效率,但所谓的并发处理实际上是一种基于轮询的模拟并行。本文探讨了现代处理器如何通过虚拟化技术实现更高的并发性能,以及在.NET框架中如何有效利用线程和异步编程模式。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 本文通过具体示例详细介绍了 Python 中的装饰器和装饰类的使用方法,包括带参数的装饰器和装饰类的应用场景。 ... [详细]
  • 每个人都有自己的小故事,今天就让我们一起来分享那些发生在生活中的尴尬时刻吧。首先由我开始。因为拥有一张婴儿般的面孔,我总是被误认为比实际年龄年轻得多。高中时期,同学们都以为我是初中生;到了大学,大家又误认为我还是高中生。即使毕业后,人们也常把我当作是大学生。 ... [详细]
  • 解决 Pytest 运行时出现 FileNotFoundError 的方法
    在使用 Pytest 进行测试时,可能会遇到 FileNotFoundError 错误,提示无法找到指定的文件或目录。本文将探讨该错误的原因及解决方案。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • 本文详细介绍了调整汽车前灯的方法,包括选择合适的场地、标记关键点、精确测量及具体调节步骤等,确保驾驶安全。 ... [详细]
  • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
  • 深度学习与神经网络课程总结
    本文档总结了神经网络和深度学习课程中的关键概念和理论,包括机器学习的基本要素、算法类型以及数据特征表示等。 ... [详细]
  • 解决Python3中TypeError: can't concat str to bytes问题
    本文介绍了如何在Python3中解决尝试将字符串(str)与字节(bytes)类型进行连接时出现的TypeError错误,通过使用encode()方法将字符串转换为字节类型。 ... [详细]
  • 本视频详细介绍了如何利用J2EE、JBPM 3.x/4.3、Flex流程设计器、jQuery以及授权认证机制构建高效的企业普及版贝斯OA及工作流管理系统。 ... [详细]
  • 本文详细介绍了传输层的基本概念、功能、协议类型及其与应用层的关系,重点探讨了TCP和UDP协议的工作原理、特点及应用场景,旨在为读者提供全面的传输层知识概览。 ... [详细]
author-avatar
一个不需要幸福的男人丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有