http://lzw.me/pages/ecmascript/#203
抽象等値比較アルゴリズム
比較演算x == y。ここで、xおよびyは値であり、trueまたはfalseを生成します。このような比較は次のように行われます。
- タイプ(x)がタイプ(y)と同じ場合、
- Type(x)がUndefinedの場合、trueを返します。
- Type(x)がNullの場合、trueを返します。
- タイプ(x)が数値の場合、
- 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)がブール値の場合、xとyの両方がtrueまたはfalseのときにtrueが返されます。それ以外の場合は、falseを返します。
- xとyが同じオブジェクトを参照している場合にtrueを返します。それ以外の場合は、falseを返します。
- xがnullでyが未定義の場合、trueを返します。
- xが未定義でyがnullの場合、trueを返します。
- Type(x)がNumberでType(y)がStringの場合、比較結果x == ToNumber(y)を返します。
- タイプ(x)が文字列でタイプ(y)が数値の場合、
- ToNumber(x)== yの比較結果を返します。
- Type(x)がブール値の場合、ToNumber(x)== yの比較結果を返します。
- Type(y)がブール値の場合、x == ToNumber(y)を比較した結果を返します。
- タイプ(x)が文字列または数値で、タイプ(y)がオブジェクトの場合、x == ToPrimitive(y)の比較結果を返します。
- Type(x)がObjectでType(y)がStringまたはNumberの場合、ToPrimitive(x)== yの比較結果を返します。
- falseを返します。
上記の定義によれば、
- 文字列の比較は、このように強制することができます
"" + a == "" + b
。 - 値の比較は、このように強制することができます
+a == +b
。 - ブール値の比較は、このように強制することができます
!a == !b
。
等価比較操作では、次の変更がないことが保証されます。
A != B
と同等!(A==B)
です。A == B
B == A
AおよびBの実行順序を除いて、と同等です。
等価演算子は常に渡されるわけではありません。たとえば、2つの異なるStringオブジェクトが同じ文字列値を表している場合、==
演算子は各Stringオブジェクトは文字列値と等しいと見なしますが、2つの文字列オブジェクトは互いに等しくありません。たとえば、次のとおりです。
new String("a") == "a"
そして、"a" == new String("a")
それは本当です。new String("a")
==
new String("a")
偽です。
文字列比較に使用される方法は、文字エンコーディングユニットのシーケンスが同じかどうかを簡単に検出することです。Unicode仕様で定義されている複雑なセマンティックベースの文字または文字列の等価定義と照合順序はありません。したがって、Unicode標準では、等しいString値は等しくないと検出される場合があります。実際、このアルゴリズムは、2つの文字列がすでに正規化された形式になっていると考えています。