在ES5中,如何比较两个值是否相等?
1 === 1; // => true
'abc' === 'abc'; // => true
1 === '1'; // => false
1 === true; // => false
相信大家都知道,无非就是用严格相等运算符(===),但是对于该方法中NaN不等于自身以及+0等于-0,无疑是一种缺陷。在这里,我们引出了一种新的方法。
ES6提出“Same-value equality”(同值相等)算法用于解决JavaScript在所有环境中,只要两个值是一样的,他们的值就应该相等。object.is就是部署这个算法的新方法。
1 === 1; // true
'abc' === 'abc' // true
object.is(1,1) // ture
object.is('abc','abc') // true
1 === NaN; // false
object.is(1,NaN) // false
ES5 严格比较运算符
+0 === -0 //true
NaN === NaN //false
ES6 Object.is()
object.is(+0,-0) //false
object.is(NaN,NaN) //true
可以看出,Object.is方法和严格比较运算符的行为基本一致,不同之处只有两个:一是+0
不等于-0
,二是NaN
等于自身。
由上面可以看出,严格相等运算符是比较值的好方法。
想要检查NaN值或对+0和-0更严格的区分,ES5 也可以通过下面的代码,部署Object.is()
代码如下:
if (!Object.is) {
Object.is = function (x, y) {
if (x === y) {
// 处理 0 === -0 的情况
return x !== 0 || x / 1 !== y / 1
} else {
// 处理 NaN === NaN 为 false 的情况
return x !== x && y !== y
}
}
}
console.log(Object.is(NaN,NaN));
console.log(Object.is(+0,-0));
打印结果如下:
Object.is()
作为比较值的函数性方法也很有用,在这里就不列举了。