比較 x == y, x 和 y 是值變量,返回 true 或者 false.這樣的比較判斷遵循如下規律:算法
若是 x 和 y 的類型一致(僅包括Number,String,Null,Undefined,Boolean,Object。Symbol屬於ES6)
- 若是 x 的類型是 Underfined,返回 true.
- 若是 x 的類型是 Null,返回 true.
-
若是 x 的類型是 Number,那麼:測試
- 若是 x 是 NaN,那麼返回 false.
- 若是 y 是 NaN,那麼返回 false.
- 若是 x 和 y 的值相等,那麼返回 true.
- 若是 x 是 +0 且 y 的值是 -0,返回 true.
- 若是 x 是 -0 且 y 的值是 +0,返回 true.
- 其餘狀況返回 false.
- 若是 x 的類型是 String,那麼除非 x 和 y 的字符順序徹底相同,且長度相等。不然返回 flase.
- 若是 x 的類型是 Boolean,若是 x 和 y 都是 true 或 false.不然返回 flase.
- 若是 x 和 y 引用自相同 Object,返回 true.
若是 x 爲 null 且 y 爲 underfined,返回 true.
若是 x 爲 underfined 且 y 爲 null,返回 true.
若是 x 的類型爲 Number 且 y 的類型爲 String,返回的結果爲 x == ToNumber(y).
若是 x 的類型爲 String 且 y 的類型爲 Number,返回的結果爲 ToNumber(x) == y.
若是 x 的類型爲 Boolean,返回的結果爲 ToNumber(x) == y.
若是 y 的類型爲 Boolean,返回的結果爲 x == ToNumber(y).
若是 x 的類型爲 String 或者 Number 且 y 的類型是 Object,返回的結果是 x == ToPrimitive(y).
若是 x 的類型爲 Object 且 y 的類型是 String 或者 Number,返回的結果是 ToPrimitive(x) == y.
除以上狀況,所有返回 false.
TIPS
-
如下類型轉換規則編碼
- 字符串類型比較能夠是: "" + a == "" + b
- 數字類型比較能夠是: +a == +b
- 布爾類型比較能夠是: !a == !b
-
如下操做等式結果不變code
-
- != B 的結果與 !(A==B) 相同
-
- == B 的結果與 B == A 相同,除了對A和B的斷定順序有區別之外其餘等同
-
等式操做的傳遞性並不老是正確的.好比,存在兩個含有相同字符的字符串對象;每個字符串對象均可以被認爲等同於該字符,但兩個字符串對象並不相等:對象
- new String("a") == "a" 與 "a" == new String("a") 結果都爲 true.
- new String("a") == new String("a") 的結果倒是 false.
- 字符串的比較僅僅是簡單的順序比較每一個字符的值。並無嘗試使用更加複雜的,以語義爲導向的字符定義或是字符串同性測試或是整理 Unicode 碼的定義順序。所以,僅根據Unicode標準規範,字符串值便可推測爲不相等(好比不會比較全角和半角的編碼差別)。實際上這個算法推測兩端的字符串都已是普通樣式。