JavaScript では、[]==![]
結果がtrue
. デモ
この結果はわかりません。理由を説明できますか?
[]
は配列です![]
が、ブール値です。タイプの異なる2つのオブジェクトを==
両方のオブジェクトと比較しようとする場合は常に、比較可能なオブジェクトに変換する必要があります(を使用してToNumber
、11.9.3の手順7を参照してください)。これがtrueを生成する理由[] == ![]
であり、最初の空の配列はに評価されfalse
ます。
11.9.3抽象的な等式比較アルゴリズム
x == y(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)がブール値の場合、比較ToNumber(x)==yの結果を返します。
- Type(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。
- Type(x)がStringまたはNumberのいずれかであり、Type(y)がObjectの場合、比較の結果x == ToPrimitive(y)を返します。
- Type(x)がObjectで、Type(y)がStringまたはNumberの場合、比較ToPrimitive(x)==yの結果を返します。
- falseを返します。
ただし、厳密な型比較演算子を使用すると===
、両方の型が異なるため、結果はfalseになります。
11.9.6厳密な等式比較アルゴリズム
x === y(xとyは値)の比較では、trueまたはfalseが生成されます。このような比較は次のように実行されます。
- Type(x)がType(y)と異なる場合は、falseを返します。
- Type(x)がUndefinedの場合、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)がブール値の場合、xとyが両方ともtrueまたは両方がfalseの場合はtrueを返します。それ以外の場合は、falseを返します。
- xとyが同じオブジェクトを参照している場合は、trueを返します。それ以外の場合は、falseを返します。