相等操作符
ES中提供两种比较相等性的操作符,相等与不相等、全等和不全等。
一、相等和不相等
- 如果有一个操作符是布尔值,则在比较相等性之前先转换为数值,false转换为0,true转换为1
- 如果一个操作数是字符串,另一个是数值,在比较相等性之前先把字符串转换成数值
- 如果一个操作数是对象,另一个不是,则调用valueOf()方法,得到基本类型值再按照前面的规则进行比较
- null和undefined是相等的
- 比较相等性之前,不能将null和undefined转换成其他任何值
- 如果有一个操作数是NaN,则相等操作符返回false,不相等返回true。NaN不等于NaN
- 如果两个操作数都是对象,则比较他们是不是指向同一个内存地址。指向同一个则返回true,否则返回false
二、全等和不全等
在不转换操作数的前提下进行,比较操作数的相等性。推荐使用全等和不全等。
三、Object.is()
ES5比较两个值是否相等,只有相等和全等运算符。前者会自动转换数据类型,后者NaN不等于自身,以及+0等于-0。
ES6提出“Same-value equality”同值相等算法,比较两个值是否严格相等,与全等运算符行为基本一致,不同之处就是+0不等于-0,NaN等于自身
Object.is(+0,-0); //false
Object.is(NaN,NaN); //true
//Object.is的实现代码
Object.definedProperty(Object,'is',{
value: function(x,y){
if(x===y){
return x !== 0 || 1 / x === 1 / y
}
return x !== x && y !== y
},
writable: false,
enumerable: false,
configurable: true
});