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 === NaN→false(NaN与任何值都不相等,包括自己)+0 === -0→true(正零和负零在数值上相等)
3. Object.is() (Same-value equality)
- 无类型转换,行为最接近“完全相等”。
- 修复了
===的两个特殊情况:Object.is(NaN, NaN)→trueObject.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 === NaN 为 true | Object.is() | 例如:检查计算结果是否为 NaN |
需要区分 +0 和 -0 | Object.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 === NaN 为 true,+0 !== -0,用于需要精确相等的场景。 |
一句话:日常开发优先使用 ===;只有在需要处理 NaN 或区分 +0/-0 时,才使用 Object.is()。避免使用 ==。
THE END


