等值運算符

2018-06-16 15:19 更新

語法:

EqualityExpression : RelationalExpression EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpressionEqualityExpressionNoIn : RelationalExpressionNoIn EqualityExpressionNoIn == RelationalExpressionNoIn EqualityExpressionNoIn != RelationalExpressionNoIn EqualityExpressionNoIn === RelationalExpressionNoIn EqualityExpressionNoIn !== RelationalExpressionNoIn

 語義:

 執(zhí)行相等比較運算符的結果總是Boolean類型。表示是否由運算符指定的關系對兩操作數(shù)成立。

 EqualityExpressionNoIn跟EqualityExpression完全按相同的方式執(zhí)行,出了RelationalExpressionNoIn要代替RelationalExpression被執(zhí)行。

The Equals Operator ( == )

 產生式 EqualityExpression : EqualityExpression == RelationalExpression 按照下面的過程執(zhí)行 :

  1. 令 lref 為解釋執(zhí)行 EqualityExpression 的結果 .
  2. 令 lval 為 GetValue(lref).
  3. 令 rref 為解釋執(zhí)行 RelationalExpression 的結果 .
  4. 令 rval 為 GetValue(rref).
  5. 返回做用相等比較算法于 rval == lval( 參見 11.9.3) 的結果

The Does-not-equals Operator ( != )

 產生式 EqualityExpression : EqualityExpression != RelationalExpression 按照下面的過程執(zhí)行 :

  1. 令 lref 為解釋執(zhí)行 EqualityExpression 的結果 .
  2. 令 lval 為 GetValue(lref).
  3. 令 rref 為解釋執(zhí)行 RelationalExpression 的結果 .
  4. 令 rval 為 GetValue(rref).
  5. 令 r 為做用相等比較算法于 rval == lval( 參見 11.9.3) 的結果
  6. 如果 r 為 true,返回 false. 否則 , 返回 true.

抽象相等比較算法

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

  1. 若Type(x)與Type(y)相同, 則若Type(x)為Undefined, 返回true。若Type(x)為Null, 返回true。若Type(x)為Number, 則若x為NaN, 返回false。若y為NaN, 返回false。若x與y為相等數(shù)值, 返回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。
  2. 若x為null且y為undefined, 返回true。
  3. 若x為undefined且y為null, 返回true。
  4. 若Type(x) 為 Number 且 Type(y)為String, 返回comparison x == ToNumber(y)的結果。
  5. 若Type(x) 為 String 且 Type(y)為Number,
  6. 返回比較ToNumber(x) == y的結果。
  7. 若Type(x)為Boolean, 返回比較ToNumber(x) == y的結果。
  8. 若Type(y)為Boolean, 返回比較x == ToNumber(y)的結果。
  9. 若Type(x)為String或Number,且Type(y)為Object,返回比較x == ToPrimitive(y)的結果。
  10. 若Type(x)為Object且Type(y)為String或Number, 返回比較ToPrimitive(x) == y的結果。
  11. 返回false。

 按以上相等之定義:

  • 字符串比較可以按這種方式強制執(zhí)行: "" + a == "" + b 。
  • 數(shù)值比較可以按這種方式強制執(zhí)行: +a == +b 。
  • 布爾值比較可以按這種方式強制執(zhí)行: !a == !b 。

 等值比較操作保證以下不變:

  • A != B 等價于 !(A==B) 。
  • A == B 等價于 B == A ,除了A與B的執(zhí)行順序。

 相等運算符不總是傳遞的。例如,兩個不同的String對象,都表示相同的字符串值; == 運算符認為每個String對象都與字符串值相等,但是兩個字符串對象互不相等。例如:

  • new String("a") == "a" 和 "a" == new String("a") 皆為true。
  • new String("a") == new String("a") 為false。

 字符串比較使用的方式是簡單地檢測字符編碼單元序列是否相同。不會做更復雜的、基于語義的字符或者字符串相等的定義以及Unicode規(guī)范中定義的collating order。所以Unicode標準中認為相等的String值可能被檢測為不等。實際上這一算法認為兩個字符串已經是經過規(guī)范化的形式。

嚴格等于運算符 ( === )

 產生式 EqualityExpression : EqualityExpression === RelationalExpression 按照下面的過程執(zhí)行 :

  1. 令 lref 為解釋執(zhí)行 EqualityExpression 的結果 .
  2. 令 lval 為 GetValue(lref).
  3. 令 rref 為解釋執(zhí)行 RelationalExpression 的結果 .
  4. 令 rval 為 GetValue(rref).
  5. 返回做用嚴格相等比較算法于 rval === lval( 參見 11.9.6) 的結果

The Strict Does-not-equal Operator ( !== )

 產生式 EqualityExpression : EqualityExpression !== RelationalExpression 按照下面的過程執(zhí)行 :

  1. 令 lref 為解釋執(zhí)行 EqualityExpression 的結果 .
  2. 令 lval 為 GetValue(lref).
  3. 令 rref 為解釋執(zhí)行 RelationalExpression 的結果 .
  4. 令 rval 為 GetValue(rref).
  5. 令 r 為做用嚴格相等比較算法于 rval === lval( 參見 11.9.6) 的結果
  6. 如果 r 為 true,返回 false. 否則 , 返回 true.

嚴格等于比較算法

 比較 x===y,x 和 y 為值,需要產出 true 或 false。比較過程如下:

  1. 如果 Type(x) 與 Type(y) 的結果不一致,返回 false,否則
  2. 如果 Type(x) 結果為 Undefined,返回 true
  3. 如果 Type(x) 結果為 Null,返回 true
  4. 如果 Type(x) 結果為 Number,則如果 x 為 NaN,返回 false如果 y 為 NaN,返回 false如果 x 與 y 為同一個數(shù)字,返回 true如果 x 為 +0,y 為 -0,返回 true如果 x 為 -0,y 為 +0,返回 true返回 false
  5. 如果 Type(x) 結果為 String,如果 x 與 y 為完全相同的字符序列(相同的長度和相同的字符對應相同的位置),返回 true,否則,返回 false
  6. 如果 Type(x) 結果為 Boolean,如果 x 與 y 都為 true 或 false,則返回 true,否則,返回 false
  7. 如果 x 和 y 引用到同一個 Object 對象,返回 true,否則,返回 false

 此算法與 SameValue 算法在對待有符號的零和 NaN 上表現(xiàn)不同。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號