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;
}
}
});
}