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)
→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 === 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