JavaScript 判斷相等的運算符分紅相等運算符(==)和全等運算符(===),彷佛==
和===
並無統一的翻譯,且把它們分紅"相等"和"全等"好了。javascript
判斷是否全等的規則:java
若是操做數類型不一樣,那麼不全等。數組
若是兩者都是null
, 全等。翻譯
若是都是undefined
, 全等。code
若是其中之一爲NaN
, 不全等。對象
若是兩者都爲true
或false
, 全等。ip
若是都爲數值且值相等,全等。字符串
若是都爲字符串,且值相等,全等。get
若是都指向同一個引用類型,全等。it
其餘狀況,不全等。
// 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
方法。
判斷是否相等的規則:
若是操做數類型一致,且知足全等的條件,則相等,不然不相等。
若是操做數類型不一致:
若是一個是null
, 另外一個是undefined
, 相等。
若是一個是數字,另外一個是字符串,把字符串轉換成數字再比較。
若是一個是布爾值,把true
轉成1, false
轉成0, 而後再比較。
若是一個是對象,另外一個是數字或者字符串,把對象轉成基本類型值再比較。
其餘狀況,不相等。
1 == true // true
根據條件2.3,把true
轉成1。
而後兩個操做數類型一致,知足條件1,使用全等比較。
都爲數值且相等,全等。
相等。
'' == 0 // true
根據2.2,把''
轉換成數字,即0。
而後兩個操做數類型一致,知足條件1,使用全等比較。
都爲數值且相等,全等。
相等。
null == 0 // false
條件3,屬於其餘狀況,不相等。
null == undefined
條件2.1,相等。
NaN == NaN // false
類型一致,轉換成全等比較
NaN === NaN 不成立,所以不全等
因此不相等
[''] == '' // true
條件2.4,先把數組轉換成基本類型
比較'' == ''
,類型相同,轉成全等比較
類型相同,且值相同,全等。
相等。
{} == true // false
true
轉換成1,而後對象轉換成基本類型值,即"[object Object]" == 1
條件2.2,把字符串轉換成數字,獲得NaN == 1
,類型相同,轉成全等比較。
類型相同,但值不一樣,因此不全等。
不相等。
初看上去,內容很是的繁雜,可是若是碰到的時候就來查一下,很快就能有肌肉記憶了。