昔書いたコードみていたら、
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 に!
ありがとうございました!