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 的等號運算符

相關文章
相關標籤/搜索