严格相等(===)比较 nan 时返回 false,因 ecmascript 遵循 ieee 754 标准,规定 nan 不等于任何值(含自身);object.is() 采用 samevalue 算法,使 nan === nan 为 true,更符合直觉,适用于 nan 检测、深比较等场景。

严格相等(===)在比较 NaN 时返回 false,这是它最反直觉的特性之一:即使两个值都是 NaN,NaN === NaN 仍为 false。这不是 bug,而是 JavaScript 规范中对“值不可预测性”的显式设计——NaN 表示“不是一个有效数字”,因此它不等于任何东西,包括自身。
为什么 === 对 NaN 返回 false?
ECMAScript 明确规定:NaN 在所有相等性比较中(包括 === 和 ==)都必须返回 false。这源于 IEEE 754 浮点标准,目的是避免因计算误差导致的错误相等判断。例如:
-
Math.sqrt(-1) === Math.sqrt(-1)→false(两者都是NaN,但===不认) -
0 / 0 === Number("abc")→false(尽管语义上都代表“无效数值”,但===不做语义推断)
Object.is 如何修正这一行为?
Object.is() 实现的是规范中的 SameValue 算法,它把 NaN 视为一个确定的、可识别的值。因此:
通过 REST API 管理 Kibana 保存的对象(仪表板、Lens 可视化等)。适用于:① 以编程方式创建、更新、删除仪表板和 Lens 可视化。
-
Object.is(NaN, NaN)→true -
Object.is(Math.pow(-1, 0.5), 0 / 0)→true(只要两边都是NaN,就认定“完全相同”)
这种设计让判断更符合开发者直觉,尤其在需要精确校验计算结果是否“真正失败”(而非只是未定义)的场景中非常实用。
实际开发中该选哪个?
日常类型+值判断用 === 完全够用;但涉及以下情况,应优先考虑 Object.is:
- 需要可靠检测
NaN(比如清洗数据、验证 API 返回值是否为有效数字) - 实现深比较或 memoization 逻辑时,要求
+0和-0被视为不同值(如金融计算中符号零有业务含义) - 编写工具函数(如
uniqBy、deepEqual),需保证值的同一性判断无歧义
一个小提醒:别用 Object.is 判断类型
Object.is(5, "5") 返回 false,但这只是因为类型不同,不是它在“检查类型”。它不提供类型信息,也不调用 typeof。若真要确认是否同为 number 或同为 string,仍需配合 typeof 或 Object.prototype.toString.call() 使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










