nan 是 ieee 754 定义的不可比较的无效值,代表计算失败而非具体数字;其二进制编码因来源不同而异,故所有比较运算(==、===、>等)均返回 false。

因为 NaN 在语言设计和底层标准中被明确定义为“不可比较的无效值”,它不表示某个具体数字,而是计算失败的信号——所以连它自己都不能说“等于自己”。
NaN 不是“一个值”,而是一类失效状态
JavaScript 中的 NaN 类型是 number,但它不代表任何实际数值。它出现于非法运算(如 0/0、Math.sqrt(-1)、Number("abc")),本质是浮点运算崩溃后返回的占位符。IEEE 754 标准规定:NaN 是一组编码特殊的“非数字”状态,不同来源产生的 NaN 在二进制层面可能有细微差异,因此无法定义“相等”的逻辑基础。
所有比较运算符对 NaN 都失效
无论是 ==、===,还是 、>,只要操作数中有一个是 NaN,结果一律为 false:
-
NaN == NaN→ false -
NaN === NaN→ false -
NaN > 5→ false NaN → false
这不是 bug,而是标准强制行为:只要参与比较的值是 NaN,就跳过数值判断,直接返回 false。这是为了防止把“计算异常”误当作有效结果继续传递。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
正确检测 NaN 的方法只有两个靠谱的
不能用相等判断,只能靠专用函数:
- Number.isNaN(value):最推荐。只在 value 确实是 number 类型且值为 NaN 时返回 true;不转换类型,无歧义。
- Object.is(value, NaN):ES6 引入的严格抽象相等,专门把 NaN 和 NaN 视为相同——这是唯一让 NaN “等于自己”的官方方式。
注意避开 isNaN():它会先尝试把参数转成数字,isNaN(" ")、isNaN(null) 都返回 false,isNaN({}) 却返回 true,容易误判。
一个小技巧:用 value !== value 检测 NaN
这是唯一能利用 NaN 自身特性的“黑魔法”:因为只有 NaN 满足 value !== value 为 true。但它可读性差,语义模糊,仅适合极简场景或底层工具函数,不建议业务代码中使用。










