Object.is() 与原来的比较操作符 ===、== 的区别?
面试速答(30 秒版 TL;DR)
==:会做类型转换(coercion),规则复杂,面试一般建议少用。===:严格相等,不做类型转换,但对NaN、+0/-0有两个“历史行为”。Object.is:使用SameValue语义:Object.is(NaN, NaN) === trueObject.is(+0, -0) === false
关键差异一眼看懂(表格)
| 场景 | == | === | Object.is |
|---|---|---|---|
NaN vs NaN | false | false | true |
+0 vs -0 | true | true | false |
1 vs '1' | true | false | false |
最小例子:这两个坑你要会背
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.is:NaN等于自身,+0/-0可区分。