nan不等于nan是ieee 754标准的强制规定,javascript严格遵循;nan是“计算失败信号”而非数值,其比较一律返回false;识别nan相等性应使用number.isnan()或object.is()。

NaN 不等于 NaN 不是 JavaScript 的 bug,而是 IEEE 754 浮点数标准的硬性规定,JavaScript 完全继承并严格执行这一设计。
IEEE 754 标准定义了 NaN 的“不可比较性”
在底层二进制表示中,NaN 并非单一固定值,而是一类特殊编码——其指数位全为 1,尾数位非零。不同来源产生的 NaN(如 0/0、Math.sqrt(-1)、Number("abc"))可能对应不同的尾数模式,它们属于同一语义类别(“无效结果”),但没有统一的比特级标识。标准明确要求:任何涉及 NaN 的比较运算(==、===、、<code>> 等)必须无条件返回 false,包括 NaN === NaN。
NaN 本质是“计算失败的信号”,不是数值
它不表示某个未知数字,而是代表运算已崩溃、结果无定义。比如:
-
0 / 0是数学未定义式,无法赋予确定值; -
∞ − ∞或0 × ∞同样没有唯一解; -
Math.log(-1)在实数域无意义。
把这些不同来源的“失败状态”强行判定为“相等”,就像说“数据库连接超时”等于“磁盘写入权限被拒”——逻辑上不成立,也不利于错误隔离。
语言实现必须屏蔽 NaN 的“自反性”
JavaScript 的抽象相等算法(==)和严格相等算法(===)都明确规定:只要任一操作数是 NaN,立即返回 false,跳过后续数值比对。这是为了防止失效值被误当作有效数据继续流转。例如:
-
[NaN].indexOf(NaN)返回-1(因===判定失败); -
NaN === NaN为false,确保条件分支不会意外进入“正常路径”; - 聚合函数如
Math.max(1, NaN, 3)返回NaN,而非静默忽略。
真正能识别 NaN 相等性的只有两个官方方式
它们绕开了常规比较逻辑,专为 NaN 设计:
-
Number.isNaN(value):先确认value类型是number,再检查其值是否为 NaN,不触发类型转换,语义清晰可靠; -
Object.is(value, NaN):ES6 引入的同值相等算法,将NaN视为与自身相等(同时区分+0和-0),是唯一让NaN === NaN成立的合法途径。
而 isNaN() 因会强制转换参数(如 isNaN(" ") → false),容易误判,不应在严谨场景使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











