Object.is() 详解
·
Yin灏
ES5 判断两个值是否相等,有两种方法:相等运算符(==)和严格相等运算符(===)。这两种方法都有缺点,前者会自动转换数据类型,后者判断NaN
不等于自身,+0
等于 -0
ES6 新出了 Object.is 方法解决这个问题。如果满足以下任意条件则两个值相等:
- 都是
undefined
- 都是
null
- 都是
true
或都是false
- 都是相同长度、相同字符、按相同顺序排列的字符串
- 都是相同对象(意味着都是同一个对象的值引用)
- 都是数字且
- 都是
+0
- 都是
-0
- 都是
NaN
- 都是同一个值,非零且都不是
NaN
- 都是
它与与严格相等运算符(===)基本一致,不会进行强制类型转换,不同之处只有两个:一是+0
不等于-0
,二是NaN
等于自身。
- Polyfill
if (!Object.is) {
Object.defineProperty(Object, "is", {
value: function (x, y) {
// SameValue algorithm
if (x === y) {
// 针对+0 不等于 -0的情况
return x !== 0 || 1 / x === 1 / y;
} else {
// 针对NaN的情况
return x !== x && y !== y;
}
},
});
}