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 提供了更精确的比较方式。