8

JavaScript では、[]==![]結果がtrue. デモ

この結果はわかりません。理由を説明できますか?

4

1 に答える 1

10

[]は配列です![]が、ブール値です。タイプの異なる2つのオブジェクトを==両方のオブジェクトと比較しようとする場合は常に、比較可能なオブジェクトに変換する必要があります(を使用してToNumber、11.9.3の手順7を参照してください)。これがtrueを生成する理由[] == ![]であり、最初の空の配列はに評価されfalseます。

11.9.3抽象的な等式比較アルゴリズム

x == y(xとyは値)の比較では、trueまたはfalseが生成されます。このような比較は次のように実行されます。

  1. [...]
  2. xがnullで、yが未定義の場合、trueを返します。
  3. xが未定義で、yがnullの場合、trueを返します。
  4. Type(x)がNumberで、Type(y)がStringの場合、比較の結果x == ToNumber(y)を返します。
  5. Type(x)がStringで、Type(y)がNumberの場合、比較の結果ToNumber(x)==yを返します。
  6. Type(x)がブール値の場合、比較ToNumber(x)==yの結果を返します。
  7. Type(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。
  8. Type(x)がStringまたはNumberのいずれかであり、Type(y)がObjectの場合、比較の結果x == ToPrimitive(y)を返します。
  9. Type(x)がObjectで、Type(y)がStringまたはNumberの場合、比較ToPrimitive(x)==yの結果を返します。
  10. falseを返します。

ただし、厳密な型比較演算子を使用すると===、両方の型が異なるため、結果はfalseになります。

11.9.6厳密な等式比較アルゴリズム

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の場合、
    1. xがNaNの場合、falseを返します。
    2. yがNaNの場合、falseを返します。
    3. xがyと同じ数値である場合、trueを返します。
    4. xが+0でyが-0の場合、trueを返します。
    5. xが-0で、yが+0の場合、trueを返します。
    6. falseを返します。
  5. Type(x)がStringの場合、xとyがまったく同じ文字シーケンス(対応する位置で同じ長さと同じ文字)であればtrueを返します。それ以外の場合は、falseを返します。
  6. Type(x)がブール値の場合、xとyが両方ともtrueまたは両方がfalseの場合はtrueを返します。それ以外の場合は、falseを返します。
  7. xとyが同じオブジェクトを参照している場合は、trueを返します。それ以外の場合は、falseを返します。
于 2012-10-13T08:22:00.183 に答える