Arrayではまったこと

Arrayが可変長配列であると同時に連想配列であるということについて、気持ち悪さを感じながらも大して調べもせず、いい加減にコーディングしていた。結果、見事にワナにはまった。

JavaScript講座:連想配列(ハッシュ)より。

通常の配列では添字に数値を指定しますが、ここに文字列を指定すると連想配列(ハッシュ)となります。
ここで注意しなければならないことがあります。配列のキーで文字列を指定したとしても、それが数値に変換可能な場合は、数値として変換され通常の配列の要素への参照となってしまう点です。実際に以下のサンプルで確認することができます。

これを知らずに、添え字を数値にしながらハッシュのつもりで使ってしまっていた。
上記をふまえたうえでの実験結果をメモ。

var v = new Array();
v["abc"] = "item1";
v[-5] = "item2";
v[100] = "item3";
alert(v.length); // 101 ← 最大の整数添字が100なので。
for(i in v) {
  alert(i); // abc -5 100
}
alert(v[50]); // undefined

ついでに、for(i in v)でiに入るのが、対象のオブジェクトじゃなくてキーだというのも知らなかった。知らなすぎ。

それにしても、Javaのプログラムで、Integerをキーにハッシュを使っていたのが痛い。JavaScriptに移植する際には「整数に変換できない文字列」にする必要があるということか。無理やり頭に何かつけるか。