面试题:Object.is() 与比较操作符 == 和 === 的区别是什么?

Object.is()==(相等)和 ===(严格相等)都是 JavaScript 中用于比较两个值是否相等的操作,但它们在处理某些特殊情况时有显著区别。

一、核心区别概览

比较方式名称是否有类型转换特殊情况处理
==相等(Loose Equality)✅ 有(隐式类型转换)宽松,容易出错
===严格相等(Strict Equality)❌ 无类型转换大多数情况推荐
Object.is()严格相等(Same-value equality)❌ 无类型转换处理 NaN+0/-0 更精确

二、详细对比

1. == (相等 / Loose Equality)

  • 有类型转换:会尝试将两边的值转换为同一类型再比较。
  • 容易产生意外结果
5 == "5"        // true  ← 字符串 "5" 转为数字 5
true == 1       // true  ← true 转为 1
false == 0      // true  ← false 转为 0
null == undefined // true ← 特殊规则
[] == ""        // true  ← 都转为 ""
[1] == "1"      // true  ← [1].toString() === "1"

不推荐使用 ==,因为它依赖复杂的类型转换规则,容易导致 bug。


2. === (严格相等 / Strict Equality)

  • 无类型转换:只有当两个值的类型相同且值相等时才返回 true
  • 大多数情况下推荐使用
5 === "5"       // false ← 类型不同
true === 1      // false ← 类型不同
null === undefined // false ← 类型不同
[] === []       // false ← 两个不同的对象引用
{} === {}       // false ← 两个不同的对象引用

=== 有两个“不完美”的地方:

  • NaN === NaNfalseNaN 与任何值都不相等,包括自己)
  • +0 === -0true(正零和负零在数值上相等)

3. Object.is() (Same-value equality)

  • 无类型转换,行为最接近“完全相等”。
  • 修复了 === 的两个特殊情况
    • Object.is(NaN, NaN)true
    • Object.is(+0, -0)false
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 ← 与 === 不同

// 其他情况与 === 一致
Object.is("hello", "hello") // true
Object.is([], [])         // false ← 引用不同

三、何时使用哪种比较?

场景推荐方式原因
一般比较===简洁、高效、避免类型转换,是社区最佳实践
需要 NaN === NaNtrueObject.is()例如:检查计算结果是否为 NaN
需要区分 +0-0Object.is()在科学计算、金融计算中可能需要
旧代码兼容或特殊转换逻辑==不推荐,除非你完全理解转换规则

四、Object.is() 的典型应用

// 检查是否为 NaN(比 isNaN() 更可靠)
if (Object.is(value, NaN)) {
  console.log("值是 NaN");
}

// 区分 +0 和 -0
if (Object.is(x, -0)) {
  console.log("x 是负零");
}

总结

问题回答
== vs === vs Object.is()==:有类型转换,不推荐。===:无转换,大多数情况使用。Object.is():无转换,且 NaN === NaNtrue+0 !== -0,用于需要精确相等的场景。

一句话日常开发优先使用 ===;只有在需要处理 NaN 或区分 +0/-0 时,才使用 Object.is()。避免使用 ==

THE END
喜欢就支持一下吧
点赞7 分享