Object.is 比较两个 NaN 返回 true,而 === 返回 false,因其遵循 SameValue 算法,能正确处理 NaN 相等性及区分 +0 和 -0。

JavaScript 中用 Object.is 比较两个 NaN 会返回 true,这是它和 === 的关键区别之一。
为什么需要 Object.is 来比较 NaN
NaN === NaN 返回 false,这是 IEEE 754 标准的规定——“NaN 不等于任何值,包括它自己”。这会让判断一个值是否为 NaN 变得麻烦。虽然有 isNaN() 和 Number.isNaN(),但它们只适用于单个值;当你要比较两个变量是否“都是 NaN 且语义等价”时,Object.is 就派上用场了。
Object.is 对 NaN 的处理逻辑
Object.is 在内部做了特殊判断:只要两个参数都是 NaN(无论怎么产生的),就直接返回 true。它不依赖于数值位模式比对,而是按规范定义的“SameValue”算法执行:
-
Object.is(NaN, NaN)→ true -
Object.is(0, -0)→ false(它还能区分 +0 和 -0) -
Object.is(123, 123)→ true -
Object.is(+0, -0)→ false
实际使用示例
比如你从不同计算路径得到两个可能为 NaN 的结果,想确认它们“状态一致”:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
const a = Math.sqrt(-1); // NaN const b = 0 / 0; // NaN const c = "abc" * 1; // NaN <p>console.log(Object.is(a, b)); // true console.log(Object.is(a, c)); // true console.log(a === b); // false ← 普通相等不行
再比如在深比较或 memoization 场景中,若缓存键里含 NaN,用 Object.is 能保证相同 NaN 被视为同一键。
注意:不是用来“检测 NaN”
Object.is(x, NaN) 可以判断 x 是否为 NaN,但更推荐用 Number.isNaN(x),因为语义更明确、且不会把非数字类型(如字符串 "NaN")误判为 NaN。只有当你需要同时比较两个值(其中可能都是 NaN)是否“完全相同”时,Object.is 才是合适选择。

















