ECMAScript® 言語仕様のセクション 11.9.3によると、比較は次のように行われます。==
- Type(x) が Type(y) と同じ場合、
- Type(x) が未定義の場合、true を返します。
- Type(x) が Null の場合、true を返します。
- Type(x) が Number の場合、
- 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) が Boolean の場合、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) の結果を返します。
- Type(x) が String で Type(y) が Number の場合、比較 ToNumber(x) == y の結果を返します。
- Type(x) が Boolean の場合、比較 ToNumber(x) == y の結果を返します。
- Type(y) が Boolean の場合、比較 x == ToNumber(y) の結果を返します。
- Type(x) が String または Number のいずれかで、Type(y) が Object の場合、比較 x == ToPrimitive(y) の結果を返します。
- Type(x) が Object で Type(y) が String または Number の場合、比較 ToPrimitive(x) == y の結果を返します。
- false を返します。
最初のステップでToNumber()
は、 に適用されfalse
、 が生成されますNumber(0)
。2 番目のステップでは、ルール #9 がToPrimitive()
空の配列に適用さ""
れ、数値にキャストすると同様になりNumber(0)
ます。
さらに、セクション 9.2では、式でオブジェクトを使用することについて次のように述べています。
抽象演算ToBoolean
は、次の表に従って、その引数をブール型の値に変換します。
- 未定義 -> false
- Null -> false
- Boolean -> 結果は入力引数と同じです (変換なし)。
- 数値 -> 引数が +0、-0、または NaN の場合、結果は false です。それ以外の場合、結果は true です。
- 文字列 -> 引数が空の文字列 (長さがゼロ) の場合、結果は false です。それ以外の場合、結果は true です。
- オブジェクト -> true