object.is() 与 === 大部分行为一致,但 +0 与 -0 在 object.is() 中不相等(false),而 === 视为相等(true);nan 在 object.is() 中等于自身(true),而 === 返回 false;其余所有情况结果相同。

Object.is() 和 === 大部分行为一致,但关键差异集中在两个特殊数值的处理上:+0 与 -0 是否相等、NaN 是否等于自身。
处理 +0 和 -0 的方式不同
=== 认为 +0 和 -0 是同一个值:
- +0 === -0 → true
- Object.is(+0, -0) → false
这是因为 Object.is() 遵循 IEEE 754 标准中“带符号零”的语义,把 +0 和 -0 视为逻辑上不同的值。在涉及浮点运算、数值精度或某些数学库(如 WebGL、音频处理)时,这种区分可能影响结果。
对 NaN 的判断逻辑相反
=== 规定 NaN 不等于任何值,包括它自己:
- NaN === NaN → false
- Object.is(NaN, NaN) → true
这意味着用 === 检测 NaN 必须依赖 isNaN() 或 Number.isNaN();而 Object.is() 可直接用于判断一个值是否为 NaN,无需额外函数调用,更简洁安全。
其他所有情况完全一致
对于以下类型,Object.is(a, b) 和 a === b 返回结果完全相同:
- 普通数字(非 0、非 NaN),如
42 === 42和Object.is(42, 42)都为 true - 字符串、布尔值、undefined、null、Symbol、BigInt
- 对象和函数:都基于引用比较,
{}和{}总是 false
它们都不做类型转换,不兼容 null == undefined 这类宽松规则,也不受隐式 toString/valueOf 影响。
所以,日常开发用 === 就够了;只有当你需要精确区分 +0/-0,或想用统一方式检测 NaN 时,才该选 Object.is()。











