**算法
**
比較運算 x==y, 其中 x 和 y 是值,產生 true 或者 false。這樣的比較按以下方式進行:編碼
若 Type(x) 與 Type(y) 相同, 則
若 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 爲引用同一對象時返回 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。
注:按以上相等之定義:code
字符串比較能夠按這種方式強制執行: "" + 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 值可能被檢測爲不等。實際上這一算法認爲兩個字符串已是通過規範化的形式。get
比較 x===y,x 和 y 爲值,須要產出 true 或 false。比較過程以下:it
若是 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 上表現不一樣。io