NaN 不等于任何值(包括自身),这是 IEEE 754 标准规定,JS 严格遵循;其语义是“非有效数字”,表示计算失败或类型转换异常,故所有比较操作符对 NaN 均返回 false。

因为 NaN 在 JavaScript 中被设计为“不等于任何值,包括它自己”,这是 IEEE 754 浮点数标准的规定,JS 完全遵循该规范。
NaN 的语义是“不是一个有效数字”
它不代表某个具体数值,而是一种计算失败或类型转换异常的标记。比如:
-
0 / 0→NaN -
parseInt("abc")→NaN -
Math.sqrt(-1)→NaN
既然它不表示一个确定的数,就无法用常规相等逻辑(如大小、值一致)去比较。所以 NaN === NaN 返回 false 是有意为之,而非 bug。
所有比较操作符对 NaN 都返回 false
不只是 === 和 ==,包括:
-
NaN == NaN→false -
NaN === NaN→false -
NaN > 0→false NaN → <code>false-
NaN >= 0→false NaN → <code>false
唯一能可靠检测 NaN 的方式是使用 Number.isNaN()(推荐)或全局 isNaN()(注意它会强制转换,有兼容性陷阱)。
为什么不能用 == 或 === 判断 NaN?
因为它们都基于值比较,而 NaN 的值在语义上是“未定义的数字”,没有可比性。例如:
let a = 0/0;let b = Math.sqrt(-1);-
a === b→false,即使两者都是 NaN
这说明 NaN 不是一个单一值,而是多个不同来源产生的“无效结果”的统称,彼此之间也不等价。
实际判断 NaN 的正确写法
✅ 推荐:Number.isNaN(value) —— 仅当参数是真正的 NaN 时返回 true,不进行类型转换。
❌ 避免:value === NaN(永远 false)、isNaN(value)(会把 "abc"、undefined 等转成 NaN 再判,误报率高)。
? 小技巧:ES6 引入的 Object.is(NaN, NaN) 返回 true,因为它专门处理了 NaN 的特殊情况,但日常检测仍首选 Number.isNaN()。


















