JavaScript 的等号运算符

JavaScript 判断相等的运算符分红相等运算符(==)和全等运算符(===),彷佛=====并无统一的翻译,且把它们分红"相等"和"全等"好了。javascript

全等运算符

判断是否全等的规则:java

  1. 若是操做数类型不一样,那么不全等。数组

  2. 若是两者都是null, 全等。翻译

  3. 若是都是undefined, 全等。code

  4. 若是其中之一为NaN, 不全等。对象

  5. 若是两者都为truefalse, 全等。ip

  6. 若是都为数值且值相等,全等。字符串

  7. 若是都为字符串,且值相等,全等。get

  8. 若是都指向同一个引用类型,全等。it

  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 的等号运算符

相关文章
相关标签/搜索