オブジェクトと連想配列
JavaScript の配列と連想配列の違い - IT戦記
連想配列で for in を使う時でも
Object.prototype.hoge = "Foo";
とかしてたらまずいような気がしますがどうでしょう。
じゃあどうしたらいいんだろう。ループ内で hasOwnProperty とかでチェック?
オブジェクト=連想配列というのはシンプルで強力な機構ではあるのですが、連想配列として使う場合には使いづらいのではないかとよく思います。
例えば
function assocEmptyHash(key){ var hash = {}; return hash[key]; }
という関数を考えます。これを Ruby で書けば
def assoc_empty_hash(key) hash = {} hash[key] end
となるでしょう。Ruby 版は常に nil を返します。しかし JavaScript のほうは、引数がたまたま 'valueOf' だったりした場合 Object.prototype.valueOf が返ってきてしまいます。
JavaScript で同じようにするには
function assocEmptyHash(key){ var hash = {}; if (hash.hasOwnProperty(key)){ return hash[key]; } }
とするとうまく…駄目だ。hash.hasOwnProperty("__proto__") が true になってしまいます。しかも __proto__ に値をセットすると for in を使うときにも色々まずいことが起こります。てなわけで、キーをそのまま使うのはよくないみたいです。なので、キーに適当な文字列を付け加えて
hash[key + ":HASH_KEY"];
とし、セットするときにも同じ文字列を付け加えればちゃんと動きます(多分)。
とはいえ、ハッシュのアクセスのたびにこんなことするわけにもいかないので、ラッパーを作ったり使ったりするでしょう。そう考えると、最初から Object とは別の連想配列があったほうがいいなと思ってしまうのです。