2

JavaScript 判断相等的运算符分成相等运算符(==)和全等运算符(===),似乎=====并没有统一的翻译,且把它们分成"相等"和"全等"好了。

全等运算符

判断是否全等的规则:

  1. 如果操作数类型不同,那么不全等。

  2. 如果二者都是null, 全等。

  3. 如果都是undefined, 全等。

  4. 如果其中之一为NaN, 不全等。

  5. 如果二者都为truefalse, 全等。

  6. 如果都为数值且值相等,全等。

  7. 如果都为字符串,且值相等,全等。

  8. 如果都指向同一个引用类型,全等。

  9. 其他情况,不全等。

举例

// false, 类型不同#1
1 === '1' 

// fasle, #4
NaN === NaN 

// false, 虽然都是空对象,但不是同一个引用类型值
[] === []

// true, 同一个引用类型值
var firstObject = {}
var secondObject = firstObject
secondObject['name'] = 'Neo'
secondObject === firstObject 

引用类型转换成基本类型

在之前的加法运算符里面也提到过引用类型到基本类型的转换,过程大致如下:

  • 先调用valueOf方法,如果返回的是基本类型值,转换结束。

  • 如果失败了,就调用toString方法。如果返回基本类型值,转换结束。

  • 否则,抛出错误:TypeError: Cannot convert object to primitive value

大多数的原生对象在调用valueOf方法的时候都会返回对象自身,所以大多数时候其实都会调用toString方法。

Date对象比较特殊,它的valueOf方法返回的是毫秒数,在转换成基本类型值的时候直接调用toString方法。

相等运算符

判断是否相等的规则:

  1. 如果操作数类型一致,且满足全等的条件,则相等,否则不相等。

  2. 如果操作数类型不一致:

    1. 如果一个是null, 另一个是undefined, 相等。

    2. 如果一个是数字,另一个是字符串,把字符串转换成数字再比较。

    3. 如果一个是布尔值,把true转成1, false转成0, 然后再比较。

    4. 如果一个是对象,另一个是数字或者字符串,把对象转成基本类型值再比较。

  3. 其他情况,不相等。

举例

1 == true // true
  1. 根据条件2.3,把true转成1。

  2. 然后两个操作数类型一致,满足条件1,使用全等比较。

  3. 都为数值且相等,全等。

  4. 相等。


'' == 0 // true
  1. 根据2.2,把''转换成数字,即0。

  2. 然后两个操作数类型一致,满足条件1,使用全等比较。

  3. 都为数值且相等,全等。

  4. 相等。


null == 0 // false 

条件3,属于其他情况,不相等。


null == undefined

条件2.1,相等。


NaN == NaN // false
  1. 类型一致,转换成全等比较

  2. NaN === NaN 不成立,因此不全等

  3. 所以不相等


[''] == '' // true
  1. 条件2.4,先把数组转换成基本类型

  2. 比较'' == '',类型相同,转成全等比较

  3. 类型相同,且值相同,全等。

  4. 相等。


{} == true // false
  1. true转换成1,然后对象转换成基本类型值,即"[object Object]" == 1

  2. 条件2.2,把字符串转换成数字,得到NaN == 1,类型相同,转成全等比较。

  3. 类型相同,但值不同,所以不全等。

  4. 不相等。

初看上去,内容非常的繁杂,但是如果碰到的时候就来查一下,很快就能有肌肉记忆了。

参考:JavaScript 的等号运算符


dustin__
614 声望50 粉丝

前端