読者です 読者をやめる 読者になる 読者になる

new Array() == 0 -> true

[programming]
スポンサーリンク

昔書いたコードみていたら、

var a = getList(); // 配列を返す
if (a != 0) {
  // 配列に要素があれば処理を
}

なのがあって、ぎょっとしました。
本当は、下記みたいな感じでlengthを参照したかったはず。

var a = getList(); // 配列を返す
if (a.length != 0) {
  // 配列に要素があれば処理を
}

ただ、実際これでも思ったとおりの動きになっていて、、それはそれでおかしい気が。
オブジェクトと数値の比較だから、オブジェクトはtrueに変換されてから比較されるはずで、そうなると、0と比較したら、必ずfalseになるもんだと思ってました。
が、実際にやってみると、下記のような感じで、思った結果にはなりませんでした。

print(new Array() == 0); //->true
print([] == 0);          //->true
print([1] == 0);         //->false
print([1, 2] == 0);      //->false

もしかしたら、自分の型変換の考え方がちがうのかな。。
手元にサイ本が無いので、また後で確認してみようと思います。

                                                                  • -

追記@2009/09/24
os0xさんに教えていただきました。

簡単に言うと、[]は文字列にすると""(空文字列)になるので、""==0 でtrueになるんですよね…
厳密には、ECMA-262 11.9.3 抽象的等価比較アルゴリズムの20で、NumberとObjectの比較の場合、ObjectをToPrimitiveすると定義されていて、 ToPrimitiveはDefaultValueを呼び出し、結果的にtoStringが呼び出され、で上に繋がるみたいです。(ToPrimitiveはvalueOfかtoStringの結果を返す)
つまり、[1] == 1 が true に!

ありがとうございました!