跳到主要内容

Object.is() 与原来的比较操作符 ===、== 的区别?

面试速答(30 秒版 TL;DR)

  • ==会做类型转换(coercion),规则复杂,面试一般建议少用。
  • ===严格相等,不做类型转换,但对 NaN+0/-0 有两个“历史行为”。
  • Object.is:使用 SameValue 语义:
    • Object.is(NaN, NaN) === true
    • Object.is(+0, -0) === false

关键差异一眼看懂(表格)

场景=====Object.is
NaN vs NaNfalsefalsetrue
+0 vs -0truetruefalse
1 vs '1'truefalsefalse

最小例子:这两个坑你要会背

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true

console.log(+0 === -0); // true
console.log(Object.is(+0, -0)); // false

为什么会有 Object.is?

工程价值主要是“更符合直觉”的相等性,用于一些底层比较逻辑,例如:

  • 需要把 NaN 当作“相等”
  • 需要区分 +0-0

常见点名:React 在一些场景里用 Object.is 来做比较(例如 state 是否变化、依赖比较等),因为它能正确处理 NaN


常见追问

  • 什么时候用 ===,什么时候用 Object.is
    • 绝大多数业务比较用 === 足够。
    • 做“底层比较/变更检测”时,才更可能需要 Object.is 的边界语义。
  • 为什么不推荐 ==
    • 隐式类型转换会让代码更难推理,容易出 bug(除非你明确需要它的转换规则)。

易错点/坑

  • Object.is 说成“更严格的 ===”:更准确说法是“语义不同,主要体现在 NaN、+0/-0”。

速记要点(可背诵)

  • == 有类型转换,=== 无类型转换但 NaN 不等于自身、+0/-0 不区分。
  • Object.isNaN 等于自身,+0/-0 可区分。