Object.is 与 === 大多数情况下行为一致,但 Object.is 认为 NaN 等于自身且区分 +0 与 -0,而 === 则相反;其余所有值(含对象引用)二者结果相同。

Object.is 和 ===(全等运算符) 大多数情况下行为一致,但关键区别在于对 NaN、+0 与 -0 的处理方式不同。
NaN 的比较:Object.is 认为 NaN 等于自身,=== 则不成立
这是最常被注意到的差异:
-
NaN === NaN返回 false -
Object.is(NaN, NaN)返回 true
因为 === 遵循“NaN 不等于任何值(包括自己)”的 IEEE 754 规则;而 Object.is 是为精确相等设计的,明确将 NaN 视为同一值。
+0 与 -0:Object.is 区分符号,=== 则视为相等
JavaScript 中存在带符号的零,但 === 忽略符号差异:
立即学习“Java免费学习笔记(深入)”;
-
+0 === -0返回 true -
Object.is(+0, -0)返回 false
这在涉及浮点运算、数值精度或底层位操作时可能影响结果判断。例如:1 / +0 是 Infinity,1 / -0 是 -Infinity,二者语义不同。
其他值的行为完全一致
对于所有其他原始值(字符串、布尔、数字(非 ±0)、bigint、symbol)和对象引用,Object.is(a, b) 与 a === b 结果相同:
-
Object.is(42, 42)→ true,42 === 42→ true -
Object.is({}, {})→ false,{} === {}→ false(都是比较引用) -
Object.is(null, null)→ true,null === null→ true
使用建议:按需选择,不盲目替换
大多数业务逻辑中 === 足够可靠且性能略优;仅当需要严格区分 +0/-0 或确认 NaN 相等性时才用 Object.is:
- 实现深比较、缓存键计算、数值稳定性校验时,优先考虑
Object.is - 日常变量比较、条件判断、数组查找(如
Array.prototype.indexOf内部用===)仍用=== - 注意:没有“Object.is 比 === 更正确”的绝对说法,只是语义目标不同









