解析相等操作符

295 阅读1分钟

相等操作符

ES中提供两种比较相等性的操作符,相等与不相等、全等和不全等。

一、相等和不相等

  1. 如果有一个操作符是布尔值,则在比较相等性之前先转换为数值,false转换为0,true转换为1
  2. 如果一个操作数是字符串,另一个是数值,在比较相等性之前先把字符串转换成数值
  3. 如果一个操作数是对象,另一个不是,则调用valueOf()方法,得到基本类型值再按照前面的规则进行比较
  4. null和undefined是相等的
  5. 比较相等性之前,不能将null和undefined转换成其他任何值
  6. 如果有一个操作数是NaN,则相等操作符返回false,不相等返回true。NaN不等于NaN
  7. 如果两个操作数都是对象,则比较他们是不是指向同一个内存地址。指向同一个则返回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
});