ES5中的==
和===
存在着问题,==
会自动转换数据类型;===
情况下NaN不等于NaN,+0等于-0
NaN === NaN //false
+0 === -0 //true
ES6中的Object.is()
判断两个值是否相同。即只要两个值是一样的,它们就应该相等。
Object.is(NaN, NaN) //true
Object.is(+0, -0) //false
如果下列任何一项成立,则两个值相同:
- 两个值都是 undefined
- 两个值都是 null
- 两个值都是 true 或者都是 false
- 两个值是由相同个数的字符按照相同的顺序组成的字符串
- 两个值指向同一个对象
- 两个值都是数字并且
- 都是正零 +0
都是负零 -0
都是 NaN
都是除零和 NaN 外的其它同一个数字
在ES5中可以实现Object.is()
的polyfill
if (!Object.is) {
Object.is = function(x, y) {
if (x === y) { // Steps 1-5, 7-10
// 针对 +0不等于-0
return x !== 0 || 1 / x === 1 / y;
} else {
// 针对 NaN等于NaN
return x !== x && y !== y;
}
};
}
或者使用Object.defineProperty()在Object定义一个新属性is
:
Object.defineProperty(Object, 'is', {
value:function(x,y){
if(x == y){
//针对 +0不等于-0
return x !== x || 1/x === 1/y;
}
//针对 NaN等于NaN
return x !== x && y !== y;
},
configurable:true,
enumerable:false,
writable:true
});