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