詳解一下 javascript 中的比較

今天在 JS筆試題@公子 給AT了,遂想起以前要寫的一篇文章,javascript 中蛋疼的比較運算。javascript

翻譯自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3java

11.9.3 抽象相等比較算法

比較運算 x==y, 其中 xy 是值,產生 true 或者 false。這樣的比較按以下方式進行:算法

  1. Type(x)Type(y) 相同, 則segmentfault

    1. Type(x)Undefined, 返回 true微信

    2. Type(x)Null, 返回 true編碼

    3. Type(x)Number, 則spa

      1. xNaN, 返回 false翻譯

      2. yNaN, 返回 falsecode

      3. xy 爲相等數值, 返回 true對象

      4. x+0y−0, 返回 true

      5. x−0y+0, 返回 true

      6. 返回 false

    4. Type(x)String, 則當 xy 爲徹底相同的字符序列(長度相等且相同字符在相同位置)時返回 true。 不然, 返回 false

    5. Type(x)Boolean, 當 xy 爲同爲 true 或者同爲 false 時返回 true。 不然, 返回 false

    6. xy 爲引用同一對象時返回 true。不然,返回 false

  2. xnullyundefined, 返回 true

  3. xundefinedynull, 返回 true

  4. Type(x)NumberType(y)String, 返回 comparison x == ToNumber(y) 的結果。

  5. Type(x)StringType(y)Number

  6. 返回比較 ToNumber(x) == y 的結果。

  7. Type(x)Boolean, 返回比較 ToNumber(x) == y 的結果。

  8. Type(y)Boolean, 返回比較 x == ToNumber(y) 的結果。

  9. Type(x)StringNumber,且 Type(y)Object,返回比較 x == ToPrimitive(y) 的結果。

  10. Type(x)ObjectType(y)StringNumber, 返回比較 ToPrimitive(x) == y 的結果。

  11. 返回 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 值可能被檢測爲不等。實際上這一算法認爲兩個字符串已是通過規範化的形式。

11.9.6 嚴格等於比較算法

比較 x===yxy 爲值,須要產出 truefalse。比較過程以下:

  1. 若是 Type(x)Type(y) 的結果不一致,返回 false,不然

  2. 若是 Type(x) 結果爲 Undefined,返回 true

  3. 若是 Type(x) 結果爲 Null,返回 true

  4. 若是 Type(x) 結果爲 Number,則

    1. 若是 xNaN,返回 false

    2. 若是 yNaN,返回 false

    3. 若是 xy 爲同一個數字,返回 true

    4. 若是 x+0y-0,返回 true

    5. 若是 x-0y+0,返回 true

    6. 返回 false

  5. 若是 Type(x) 結果爲 String,若是 xy 爲徹底相同的字符序列(相同的長度和相同的字符對應相同的位置),返回 true,不然,返回 false

  6. 若是 Type(x) 結果爲 Boolean,若是 xy 都爲 truefalse,則返回 true,不然,返回 false

  7. 若是 xy 引用到同一個 Object 對象,返回 true,不然,返回 false

注:此算法與 SameValue 算法在對待有符號的零和 NaN 上表現不一樣。

justjavac微信公衆號

相關文章
相關標籤/搜索