Object.is 是 ES6 引入的精确值比较方法,采用 SameValue 算法,使 NaN === NaN 返回 true、+0 与 -0 不相等,其余行为与 === 一致,适用于需严格相等的场景。

判断 NaN 值不能靠 ===,因为 NaN === NaN 永远是 false;而 Object.is(NaN, NaN) 返回 true,这才是符合“值完全相同”直觉的判断方式。它的底层用的是 SameValue 算法,专为解决这类边界问题设计。
为什么 NaN 不能用常规比较?
NaN(Not-a-Number)在 JavaScript 中是一个特殊的数值,它不等于任何值——包括它自己。这是 IEEE 754 标准规定的,但对开发者来说很反直觉:
-
NaN === NaN→ false -
NaN == NaN→ false -
NaN > 1、NaN 、NaN === 0全部为 false
所以用 == 或 === 都无法可靠识别一个值是否就是 NaN。
判断 NaN 的正确方法
有且仅有两种推荐方式,都基于“类型前置 + 值判定”逻辑:
-
Number.isNaN(value):首选。先检查typeof value === 'number',再判断是否为 NaN。安全、语义清晰、不误判字符串"NaN"或空数组等 -
Object.is(value, NaN):本质等价于Number.isNaN(value)的核心判断,因为Number.isNaN内部正是用Object.is(Number(val), NaN)实现的
⚠️ 避免使用全局 isNaN(value):它会先尝试把参数转成数字,导致 isNaN("abc")、isNaN({})、isNaN([]) 全返回 true,不可靠。
Object.is 如何精准处理特殊数值?
Object.is 不只是为 NaN 设计,它统一修正了 === 在两个关键点上的偏差:
-
+0 和 -0 被视为不同值:
Object.is(+0, -0)→ false,而+0 === -0→ true -
NaN 与 NaN 相等:
Object.is(NaN, NaN)→ true,而NaN === NaN→ false - 其余所有情况(字符串、布尔、对象引用、普通数字等)行为与
===完全一致
这意味着:当你需要“内存级一致”或“数学意义上完全相同”的语义时(比如状态变更检测、深比较基础层、Set/Map 的键去重),Object.is 是更可信的选择。
实际场景中的典型用法
不是所有地方都要换,但以下情况值得主动使用 Object.is:
- 实现自定义
deepEqual工具函数:原始值比较层用Object.is(a, b),比===更鲁棒 - React 中优化
useMemo或useCallback的依赖判断:配合自定义比较函数,避免因+0/-0或NaN导致意外重新计算 - 构建数值敏感的状态管理器(如金融计算、物理模拟):确保
-0不被误认为+0,NaN能被稳定识别和追踪 - Polyfill 或兼容性封装中替代
===:当目标环境需严格遵循 SameValue 语义时
不需要替换全部 === —— 大多数业务代码里 +0 和 -0 无实质差异,强行区分反而增加维护成本。关键是理解它在哪起作用、为什么起作用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











