1. 程式人生 > >詳解 javascript 中的比較(==和===)

詳解 javascript 中的比較(==和===)

不一致 mit 如果 asc onu tin 算法 復雜 undefine

抽象相等比較算法

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

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

    1. Type(x)Undefined, 返回 true
    2. Type(x)Null, 返回 true
    3. Type(x)Number, 則

      1. xNaN, 返回 false
      2. yNaN, 返回 false
      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
    ,返回比較 x == ToNumber(y) 的結果。
  5. Type(x)StringType(y)Number,返回比較 ToNumber(x) == y 的結果。
  6. Type(x)Boolean, 返回比較 ToNumber(x) == y 的結果。
  7. Type(y)Boolean, 返回比較 x == ToNumber(y) 的結果。
  8. Type(x)StringNumber,且 Type(y)Object,返回比較 x == ToPrimitive(y) 的結果。
  9. Type(x)ObjectType(y)String
    Number, 返回比較 ToPrimitive(x) == y 的結果。
  10. 返回 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===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 上表現不同。

詳解 javascript 中的比較(==和===)