nan不等于任何值包括自身,是ieee 754标准强制规定,javascript严格遵循;其本质是“计算失败信号”而非数值,故所有比较均返回false;应使用number.isnan()或object.is()检测。

JavaScript中,NaN不等于任何值,包括它自己。所以直接用 == 或 === 判断两个 NaN 是否相等,结果永远是 false。这是由 IEEE 754 浮点数标准规定的,也是 JavaScript 的底层行为。
为什么 NaN !== NaN?
NaN(Not-a-Number)表示一个**无效或未定义的数值结果**,比如 0/0、Math.sqrt(-1)。它的设计本意不是代表某个具体“值”,而是标记计算失败的状态。因此规范要求:任何涉及 NaN 的相等比较都返回 false,避免误判不同原因产生的 NaN 为“相同”。
判断两个值是否都是 NaN 的正确方法
ES6 提供了 Number.isNaN(),它是判断 NaN 最可靠的方式:
-
Number.isNaN(NaN)→true -
Number.isNaN("abc")→false(不会强制转数字) -
Number.isNaN(undefined)→false
对比旧的全局 isNaN():它会先尝试把参数转成数字再判断,导致 isNaN("abc") 也返回 true,容易误判。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
如何判断两个变量是否“都为 NaN”且“逻辑上等价”
如果目标是确认 a 和 b 都是 NaN(即它们在语义上都代表“非数值结果”),可以这样写:
-
Number.isNaN(a) && Number.isNaN(b)—— 明确、安全、推荐 - 或者用 ES2015+ 的
Object.is(a, b):它把两个 NaN 视为相等,即Object.is(NaN, NaN) === true,同时还能正确区分+0和-0
例如:Object.is(0 / 0, Math.sqrt(-1)) → trueObject.is(NaN, "NaN") → false(类型不同,不混淆)
实际对比建议(含 NaN 场景)
若你在写一个通用的“深度相等”或“数值相等”函数,并希望 NaN 被合理处理:
- 对单个数值:优先用
Object.is(a, b),它天然支持 NaN 相等、+0/-0 区分 - 对数组或对象中的数值字段:遍历时对每个值用
Object.is比较,而不是=== - 避免用
a == b || (isNaN(a) && isNaN(b))这类组合——冗余且易出错(尤其当 a/b 是字符串或 null 时)
小提醒:TypeScript 中 number 类型变量也可能为 NaN,编译器不会阻止,运行时仍需按上述方式判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










