今天在 JS筆試題 被 @公子 給AT了,遂想起以前要寫的一篇文章,javascript 中蛋疼的比較運算。javascript
翻譯自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3java
比較運算 x==y
, 其中 x
和 y
是值,產生 true
或者 false
。這樣的比較按以下方式進行:算法
若 Type(x)
與 Type(y)
相同, 則segmentfault
若 Type(x)
爲 Undefined
, 返回 true
。微信
若 Type(x)
爲 Null
, 返回 true
。編碼
若 Type(x)
爲 Number
, 則spa
若 x
爲 NaN
, 返回 false
。翻譯
若 y
爲 NaN
, 返回 false
。code
若 x
與 y
爲相等數值, 返回 true
。對象
若 x
爲 +0
且 y
爲 −0
, 返回 true
。
若 x
爲 −0
且 y
爲 +0
, 返回 true
。
返回 false
。
若 Type(x)
爲 String
, 則當 x
和 y
爲徹底相同的字符序列(長度相等且相同字符在相同位置)時返回 true
。 不然, 返回 false
。
若 Type(x)
爲 Boolean
, 當 x
和 y
爲同爲 true
或者同爲 false
時返回 true
。 不然, 返回 false
。
當 x
和 y
爲引用同一對象時返回 true
。不然,返回 false
。
若 x
爲 null
且 y
爲 undefined
, 返回 true
。
若 x
爲 undefined
且 y
爲 null
, 返回 true
。
若 Type(x)
爲 Number
且 Type(y)
爲 String
, 返回 comparison x == ToNumber(y)
的結果。
若 Type(x)
爲 String
且 Type(y)
爲 Number
,
返回比較 ToNumber(x) == y
的結果。
若 Type(x)
爲 Boolean
, 返回比較 ToNumber(x) == y
的結果。
若 Type(y)
爲 Boolean
, 返回比較 x == ToNumber(y)
的結果。
若 Type(x)
爲 String
或 Number
,且 Type(y)
爲 Object
,返回比較 x == ToPrimitive(y)
的結果。
若 Type(x)
爲 Object
且 Type(y)
爲 String
或 Number
, 返回比較 ToPrimitive(x) == y
的結果。
返回 false
。
注:按以上相等之定義:
字符串比較能夠按這種方式強制執行: "" + a == "" + b
。
數值比較能夠按這種方式強制執行: +a == +b
。
布爾值比較能夠按這種方式強制執行: !a == !b
。
注:等值比較操做保證如下不變:
A != B
等價於 !(A==B)
。
A == B
等價於 B == A
,除了 A 與 B 的執行順序。
注:相等運算符不老是傳遞的。 例如,兩個不一樣的 String
對象,都表示相同的字符串值;==
運算符認爲每一個 String
對象都與字符串值相等,可是兩個字符串對象互不相等。例如:
new String("a") == "a"
和 "a" == new String("a")
皆爲 true
。
new String("a") == new String("a")
爲 false
。
字符串比較使用的方式是簡單地檢測字符編碼單元序列是否相同。不會作更復雜的、基於語義的字符或者字符串相等的定義以及 Unicode 規範中定義的 collating order。因此 Unicode 標準中認爲相等的 String
值可能被檢測爲不等。實際上這一算法認爲兩個字符串已是通過規範化的形式。
比較 x===y
,x
和 y
爲值,須要產出 true
或 false
。比較過程以下:
若是 Type(x)
與 Type(y)
的結果不一致,返回 false
,不然
若是 Type(x)
結果爲 Undefined
,返回 true
若是 Type(x)
結果爲 Null
,返回 true
若是 Type(x)
結果爲 Number
,則
若是 x
爲 NaN
,返回 false
若是 y
爲 NaN
,返回 false
若是 x
與 y
爲同一個數字,返回 true
若是 x
爲 +0
,y
爲 -0
,返回 true
若是 x
爲 -0
,y
爲 +0
,返回 true
返回 false
若是 Type(x)
結果爲 String
,若是 x
與 y
爲徹底相同的字符序列(相同的長度和相同的字符對應相同的位置),返回 true
,不然,返回 false
若是 Type(x)
結果爲 Boolean
,若是 x
與 y
都爲 true
或 false
,則返回 true
,不然,返回 false
若是 x
和 y
引用到同一個 Object
對象,返回 true
,不然,返回 false
注:此算法與 SameValue 算法在對待有符號的零和 NaN 上表現不一樣。