NaN 不等于自己,因为它是 IEEE 754 标准定义的无效运算结果标记,非具体数值;任何与 NaN 的比较(包括 ===、==、<、>)均返回 false,判断应使用 Number.isNaN() 等专用方法。

NaN 不等于自己,是因为它在语义上代表“未定义或不可表示的数值结果”,不是某个具体值,而是计算失败的标记。所以两个 NaN 无法被判定为“相等”——连自己都算不清,怎么比?判断它不能靠 === 或 ==,得用专门方法。
为什么 NaN !== NaN?
这是 IEEE 754 浮点数标准的规定,JavaScript 遵循该标准。NaN 的本质是“无效运算结果”的占位符,比如 0/0、Math.sqrt(-1)、parseInt("abc")。它不表示一个确定的数字,而是一种错误传播信号。因此:
- 任何与 NaN 的比较(
<、>、===、==)都返回false - 即使两个变量都赋值为
NaN,a === b仍是false - 数组中用
indexOf(NaN)找不到 NaN 元素,因为内部用的是相等比较
三种靠谱的判断方式
别再写 val === NaN,它永远是 false。推荐以下方法:
-
Number.isNaN(val):ES6 引入,最推荐。只对真正是
NaN的 number 类型返回true,不做强制转换。例如:Number.isNaN("NaN")→false,Number.isNaN(NaN)→true -
isNaN(val):老方法,会先尝试把参数转成数字再判断。比如
isNaN("hello")→true(因为转成数字是NaN),但isNaN("123")→false。容易误判,慎用 - val !== val:利用 NaN 唯一“不等于自己”的特性。简洁但可读性差,适合底层工具函数,不建议业务代码直写
常见误区和补充说明
很多人被 NaN 的名字误导,以为它是“非数字类型”。其实:
立即学习“Java免费学习笔记(深入)”;
-
typeof NaN返回"number"—— 它是 number 类型里的一个特殊值 -
null和NaN完全不同:null是空对象指针,类型是"object";NaN是数值异常,类型是"number" - NaN 在布尔上下文中为
false,参与算术运算会“传染”:比如NaN + 5→NaN
实际写法建议
日常开发中,遇到可能产生 NaN 的场景(如用户输入、接口字段、类型转换),应主动防护:
- 解析字符串数字时:用
const num = Number(str); if (Number.isNaN(num)) { /* 处理错误 */ } - 函数参数校验:开头加
if (Number.isNaN(input)) throw new Error("Expected a valid number") - 默认值兜底:比如
const value = Number(input) || 0不安全(NaN || 0是0),应写成Number.isNaN(Number(input)) ? 0 : Number(input)


















