Object.is()与双等全等的区别
# 双等 ==
相等操作符,如果两个操作数相等,则返回 true。
若两个操作数的数据类型不相同时,会将两边的操作数转换为相同类型。
# 全等 ===
全等操作符,除了在比较之前不转换操作数的类型之外,全等操作符和相等操作符没有什么区别。
全等操作符由===表示,它只在两个操作数未经转换就相等的情况下返回 true。
null == undefined 会返回 true,因为它们是 类似的值,null === undefined 会返回 false,因为它们是不同类型的值。
# Object.is()
ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。
他们都有缺点,前者会自动转换数据类型,后者的 NaN 不等于自身,以及+0 等于-0。
JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,他们就应该相等。
ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。
Object.is 就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
但和 ===有两处不同的地方:
+0 不等于-0
NaN 等于自身
// +0等于-0。
//NaN不等于自身。
;+0 === -0 // true
NaN === NaN // false
// +0不等于-0。
//NaN等于自身。
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
2
3
4
5
6
7
8
9
ES5 可以通过下面的代码,部署 Object.is。
Object.defineProperty(Object, 'is', {
value: function (x, y) {
if (x === y) {
// 针对+0 不等于 -0的情况
return x !== 0 || 1 / x === 1 / y
}
// 针对NaN的情况
return x !== x && y !== y
},
configurable: true,
enumerable: false,
writable: true,
})
2
3
4
5
6
7
8
9
10
11
12
13
# 总结
Object.is()与==运算不同之处在于==需要做类型转化,但是 Object.is()不需要做类型转化。
Object.is()与===运算不同之处在于,在===下,+0 和-0 相同,NaN 和 NaN 不同,在 Object.is()下,+0 和-0 不相同,NaN 和 NaN 相同。