【js篇】Object.is() 与 ===、==的区别详解

76 阅读2分钟

在 JavaScript 中,判断两个值是否“相等”有多种方式:==(宽松相等)、===(严格相等)和 Object.is()。虽然它们看起来功能相似,但在类型转换规则特殊值处理方面存在显著差异。

本文将系统讲解:

  • ===== 的行为差异;
  • Object.is() 的独特之处;
  • 如何选择合适的比较方式;
  • 实际开发中的使用建议。

✅ 一、三者基本对比

比较方式是否进行类型转换+0 与 -0 是否相等NaN 是否等于 NaN
==✅ 是✅ 是❌ 否
===❌ 否✅ 是❌ 否
Object.is()❌ 否❌ 否✅ 是

✅ 二、详细行为解析

1️⃣ ==(宽松相等)

  • 允许类型转换,是“最不严格”的比较方式;
  • 在不同类型之间会尝试进行隐式类型转换后再比较;

示例:

"5" == 5;         // true(字符串转为数字)
true == 1;        // true(true 转为 1)
null == undefined; // true(特殊规定)

📌 缺点:

  • 容易产生意料之外的结果;
  • 不推荐用于精确比较;

2️⃣ ===(严格相等)

  • 不会进行类型转换,如果类型不同直接返回 false
  • 是目前最常用的比较方式;
  • 对大多数情况已经足够准确;

示例:

"5" === 5;         // false(类型不同)
true === 1;        // false
null === undefined; // false
NaN === NaN;       // false(这是个问题!)

📌 优点:

  • 类型安全,避免隐式转换带来的歧义;
  • 推荐在绝大多数场景中使用;

3️⃣ Object.is()

  • 是 ES6 引入的函数,用于更精确地判断两个值是否“完全相同”;
  • 行为上与 === 相似,但修复了几个边界情况:
    • +0-0 不再相等;
    • NaN === NaN 返回 false,而 Object.is(NaN, NaN) 返回 true

示例:

Object.is("5", 5);         // false(类型不同)
Object.is(true, 1);        // false
Object.is(null, undefined); // false
Object.is(NaN, NaN);       // true ✅
Object.is(+0, -0);         // false ✅

📌 适用场景:

  • 需要区分 +0-0
  • 判断两个值是否“真正完全一致”,如 React 使用它来判断组件状态是否变化;

✅ 三、一句话总结

== 允许类型转换,结果可能不直观;
=== 更加严谨,但无法正确判断 NaN+0/-0
Object.is() 是最“精确”的比较方式,适用于需要完全一致性的场景。


✅ 四、如何选择?

场景推荐方法理由
判断用户输入或松散逻辑⚠️ ==可能误判,慎用
常规比较(推荐)===类型安全、语义清晰
需要精确判断(如状态变更检测)Object.is()支持 NaN === NaN,且区分 +0-0

✅ 五、进阶建议

  • 使用 TypeScript 可以减少类型不一致导致的比较问题;
  • 在 Vue / React 中使用 Object.is() 或其变体(如 Object.is 的 polyfill)优化性能;
  • 使用 ESLint 规则禁止使用 ==,强制使用 ===
  • 学习并理解 JavaScript 的抽象相等算法(Abstract Equality Algorithm);