javascript中nan===nan恒为false,因ieee 754规定nan不等于任何值(含自身);object.is(nan, nan)返回true,number.isnan(a)&&number.isnan(b)可安全判断两值同为nan。

JavaScript 中无法用 === 判断两个 NaN 是否相等——因为 NaN === NaN 永远返回 false,这是语言规范明确规定的陷阱。
为什么 === 无法判断 NaN 相等
根据 IEEE 754 标准,NaN(Not-a-Number)被定义为“不等于任何值,包括它自己”。JavaScript 继承了这一行为:NaN === NaN、NaN == NaN、Object.is(NaN, NaN)(注意:这个例外!)都需单独理解。
-
===和==都遵循“NaN 不等于自身”的规则,结果恒为 false -
Object.is()是唯一内置方法能正确识别NaN自身相等:Object.is(NaN, NaN) === true -
isNaN()或Number.isNaN()只能检测“是否为 NaN”,不能比较两个值是否“同为 NaN”
安全判断两个值是否“都是 NaN”
若目标是确认两个变量 同时为 NaN(例如校验计算结果是否双双失效),应组合使用 Number.isNaN():
-
Number.isNaN(a) && Number.isNaN(b)—— 推荐,严格且语义清晰 - 避免用
isNaN(a) && isNaN(b),因老版isNaN()会强制类型转换(如isNaN("abc")返回true) - 不要写
a !== a && b !== b,虽原理正确(NaN 是唯一不等于自身的值),但可读性差、易误判
需要“值相等”语义时的替代方案
当逻辑上要求“把两个 NaN 视为相等”(比如深比较、去重、缓存键生成),不能依赖 ===:
- 使用
Object.is(a, b):它对NaN、-0、+0等边界情况处理更精确 - 自定义比较函数中显式处理:
if (Number.isNaN(a) && Number.isNaN(b)) return true; - 在数组去重或 Set 中,
NaN实际已被特殊处理(Set([NaN, NaN])只存一个),但底层依赖的是SameValueZero算法(NaN被视为相等)
实际开发中的常见误写与修正
以下代码看似合理,实则有缺陷:
- ❌
if (result1 === result2) { ... }→ 若两者都是NaN,条件不成立 - ✅ 替换为
if (Object.is(result1, result2)) { ... } - ❌
arr.filter(x => x !== target)→ 若target是NaN,所有NaN元素都会保留 - ✅ 改为
arr.filter(x => !Object.is(x, target))或显式判断!Number.isNaN(target) ? x !== target : !Number.isNaN(x)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











