nan 与任何值(包括自身)比较均返回 false,这是语言规范定义;但 object.is(nan, nan) 返回 true,而 ==、=== 和 > 等运算符对 nan 的所有比较结果均为 false。

在 JavaScript 中,NaN 与任何值(包括它自己)的比较结果都是 false。这不是类型转换的问题,而是 NaN 的语言规范定义——它被设计为“不等于任何东西”,甚至不等于自身。
NaN 的比较行为是固定的,不依赖类型转换
无论你用 ==、===、、<code>> 还是 Object.is(),只要有一方是 NaN,关系比较一律返回 false(除了 Object.is(NaN, NaN) 返回 true):
-
NaN == NaN→false -
NaN === NaN→false -
NaN > 5→false NaN → <code>false-
Object.is(NaN, NaN)→true(这是唯一能可靠判断 NaN 的方式)
类型转换可能产生 NaN,但不会改变其比较特性
某些操作会隐式或显式生成 NaN(如 Number("abc")、parseInt("foo")、0 / 0),一旦值变成 NaN,后续所有常规比较都失效:
-
Number("xyz") === NaN→false(别这么写) -
isNaN(Number("xyz"))→true(传统方法) -
Number.isNaN("xyz")→false(只对真正的 NaN 返回 true) -
Number.isNaN(Number("xyz"))→true(推荐用法)
实际判断 NaN 的正确方式
不要靠比较,要用专门的检测方法:
- 优先使用
Number.isNaN(value):严格,不进行类型转换,只认真正的 NaN - 避免
isNaN(value):它会先调用Number(value),导致像isNaN(" ")或isNaN("")返回true(因为转成 0 或 0) - 需要兼容老环境时,可用
value !== value:这是 NaN 唯一自反性为 false 的值(但可读性差,不推荐日常使用)
和 null、undefined 的区别要分清
NaN 不同于 null 或 undefined:
-
null == undefined→true(抽象相等下成立) -
null === undefined→false(类型不同) -
NaN == null、NaN == undefined→ 全是false -
Number(null)是0,Number(undefined)是NaN—— 所以undefined转数字会掉进 NaN 坑里
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











