JavaScript 中 `Object.is` 与 `===` 的区别

Object.is
和 ===
都是 JavaScript 中用于比较两个值是否相等的操作符,但它们在某些情况下会有不同的行为。以下是它们的主要区别:
1. ===
(严格相等操作符)
===
是 JavaScript 中的严格相等操作符,它比较两个值是否相等,并且在比较时不会进行类型转换。它的行为如下:
- 类型不同:如果两个值的类型不同,直接返回
false
。 - 类型相同:
- 对于原始类型(如
number
、string
、boolean
),比较它们的值是否相同。 - 对于对象类型(如
object
、array
、function
),比较它们的引用是否相同(即是否指向同一个内存地址)。 - 特殊值
NaN
与任何值(包括自身)比较都返回false
。 +0
和-0
被认为是相等的。
- 对于原始类型(如
2. Object.is
Object.is
是 ES6 引入的一个方法,用于比较两个值是否“相同”。它的行为与 ===
类似,但在以下两种情况下有所不同:
NaN
的比较:Object.is(NaN, NaN)
返回true
,而NaN === NaN
返回false
。+0
和-0
的比较:Object.is(+0, -0)
返回false
,而+0 === -0
返回true
。
示例代码
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
console.log(+0 === -0); // true
console.log(Object.is(+0, -0)); // false
console.log(5 === 5); // true
console.log(Object.is(5, 5)); // true
console.log({} === {}); // false
console.log(Object.is({}, {})); // false
总结
- 如果你需要比较两个值是否严格相等,并且希望
NaN
与自身相等,或者希望区分+0
和-0
,那么应该使用Object.is
。 - 如果你不需要处理
NaN
和+0
/-0
的特殊情况,===
通常是更好的选择,因为它更简洁且性能更好。
在实际开发中,大多数情况下 ===
已经足够使用,但在处理 NaN
或 +0
/-0
时,Object.is
提供了更精确的比较方式。