nan是javascript中表示“非数字”的特殊数值,类型为number,不等于任何值(包括自身),需用number.isnan()等专用方法检测,而非==或===。

NaN 是 JavaScript 中表示“非数字”的特殊数值,类型为 number,但本身不等于任何值——包括它自己。
NaN 的本质定义
NaN(Not-a-Number)是全局对象的一个只读属性,初始值即为 NaN。它在语言规范中被定义为一个特殊的 Number 类型值,用于标识那些本应为数字、却无法表示为有效数值的运算结果。
- 它不是字符串,也不是 null 或 undefined,而是一个真实的 number 类型值:
typeof NaN === "number" - 它等价于
Number.NaN,两者在 ES5+ 中完全相同,且都不可写、不可配置 - 它不是错误状态的标志,而是计算过程中的合法结果,比如
Math.sqrt(-1)、0/0、parseInt("abc")
为什么不能用 == 或 === 判断 NaN?
因为 NaN 被设计为“与任何值都不相等”,这是 IEEE 754 浮点标准的要求:
-
NaN === NaN返回false -
NaN == NaN同样返回false - 甚至
Object.is(NaN, NaN)是唯一返回true的比较方式(ES6 引入),但日常仍推荐用检测函数
如何正确检测 NaN?
必须使用专门的检测机制,而非直接比较:
-
isNaN(value):会先尝试把 value 转为数字再判断,对"123"、""、undefined等有隐式转换,可能产生误判 -
Number.isNaN(value):更严格,只在参数本来就是 NaN 时才返回 true,推荐用于现代代码 - 例如:
Number.isNaN("hello")→false;isNaN("hello")→true
常见触发 NaN 的典型场景
理解哪些操作会产出 NaN,有助于提前预防和调试:
- 数学运算失败:如
Math.log(-1)、Math.pow(-1, 0.5) - 类型转换失败:如
Number("abc")、parseFloat("xyz") - 无效算术:如
undefined + 5、null ** -1、Infinity - Infinity - 某些 API 返回:如
document.getElementById("missing").offsetTop(元素不存在时可能为 NaN)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











