語法:
EqualityExpression : RelationalExpression EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression
EqualityExpressionNoIn : RelationalExpressionNoIn EqualityExpressionNoIn == RelationalExpressionNoIn EqualityExpressionNoIn != RelationalExpressionNoIn EqualityExpressionNoIn === RelationalExpressionNoIn EqualityExpressionNoIn !== RelationalExpressionNoIn
語義:
執(zhí)行相等比較運算符的結(jié)果總是Boolean類型。表示是否由運算符指定的關(guān)系對兩操作數(shù)成立。
EqualityExpressionNoIn跟EqualityExpression完全按相同的方式執(zhí)行,出了RelationalExpressionNoIn要代替RelationalExpression被執(zhí)行。
The Equals Operator ( == )
產(chǎn)生式 EqualityExpression : EqualityExpression == RelationalExpression 按照下面的過程執(zhí)行 :
- 令 lref 為解釋執(zhí)行 EqualityExpression 的結(jié)果 .
- 令 lval 為 GetValue(lref).
- 令 rref 為解釋執(zhí)行 RelationalExpression 的結(jié)果 .
- 令 rval 為 GetValue(rref).
- 返回做用相等比較算法于 rval == lval( 參見 11.9.3) 的結(jié)果
The Does-not-equals Operator ( != )
產(chǎn)生式 EqualityExpression : EqualityExpression != RelationalExpression 按照下面的過程執(zhí)行 :
- 令 lref 為解釋執(zhí)行 EqualityExpression 的結(jié)果 .
- 令 lval 為 GetValue(lref).
- 令 rref 為解釋執(zhí)行 RelationalExpression 的結(jié)果 .
- 令 rval 為 GetValue(rref).
- 令 r 為做用相等比較算法于 rval == lval( 參見 11.9.3) 的結(jié)果
- 如果 r 為 true,返回 false. 否則 , 返回 true.
抽象相等比較算法
比較運算x==y, 其中x和 y是值,產(chǎn)生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為相等數(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。
- 若x為null且y為undefined, 返回true。
- 若x為undefined且y為null, 返回true。
- 若Type(x) 為 Number 且 Type(y)為String, 返回comparison x == ToNumber(y)的結(jié)果。
- 若Type(x) 為 String 且 Type(y)為Number,
- 返回比較ToNumber(x) == y的結(jié)果。
- 若Type(x)為Boolean, 返回比較ToNumber(x) == y的結(jié)果。
- 若Type(y)為Boolean, 返回比較x == ToNumber(y)的結(jié)果。
- 若Type(x)為String或Number,且Type(y)為Object,返回比較x == ToPrimitive(y)的結(jié)果。
- 若Type(x)為Object且Type(y)為String或Number, 返回比較ToPrimitive(x) == y的結(jié)果。
- 返回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。
字符串比較使用的方式是簡單地檢測字符編碼單元序列是否相同。不會做更復(fù)雜的、基于語義的字符或者字符串相等的定義以及Unicode規(guī)范中定義的collating order。所以Unicode標準中認為相等的String值可能被檢測為不等。實際上這一算法認為兩個字符串已經(jīng)是經(jīng)過規(guī)范化的形式。
嚴格等于運算符 ( === )
產(chǎn)生式 EqualityExpression : EqualityExpression === RelationalExpression 按照下面的過程執(zhí)行 :
- 令 lref 為解釋執(zhí)行 EqualityExpression 的結(jié)果 .
- 令 lval 為 GetValue(lref).
- 令 rref 為解釋執(zhí)行 RelationalExpression 的結(jié)果 .
- 令 rval 為 GetValue(rref).
- 返回做用嚴格相等比較算法于 rval === lval( 參見 11.9.6) 的結(jié)果
The Strict Does-not-equal Operator ( !== )
產(chǎn)生式 EqualityExpression : EqualityExpression !== RelationalExpression 按照下面的過程執(zhí)行 :
- 令 lref 為解釋執(zhí)行 EqualityExpression 的結(jié)果 .
- 令 lval 為 GetValue(lref).
- 令 rref 為解釋執(zhí)行 RelationalExpression 的結(jié)果 .
- 令 rval 為 GetValue(rref).
- 令 r 為做用嚴格相等比較算法于 rval === lval( 參見 11.9.6) 的結(jié)果
- 如果 r 為 true,返回 false. 否則 , 返回 true.
嚴格等于比較算法
比較 x===y,x 和 y 為值,需要產(chǎn)出 true 或 false。比較過程如下:
- 如果 Type(x) 與 Type(y) 的結(jié)果不一致,返回 false,否則
- 如果 Type(x) 結(jié)果為 Undefined,返回 true
- 如果 Type(x) 結(jié)果為 Null,返回 true
- 如果 Type(x) 結(jié)果為 Number,則如果 x 為 NaN,返回 false如果 y 為 NaN,返回 false如果 x 與 y 為同一個數(shù)字,返回 true如果 x 為 +0,y 為 -0,返回 true如果 x 為 -0,y 為 +0,返回 true返回 false
- 如果 Type(x) 結(jié)果為 String,如果 x 與 y 為完全相同的字符序列(相同的長度和相同的字符對應(yīng)相同的位置),返回 true,否則,返回 false
- 如果 Type(x) 結(jié)果為 Boolean,如果 x 與 y 都為 true 或 false,則返回 true,否則,返回 false
- 如果 x 和 y 引用到同一個 Object 對象,返回 true,否則,返回 false
此算法與 SameValue 算法在對待有符號的零和 NaN 上表現(xiàn)不同。
更多建議: