トップ «前の日記(2005-12-25) 最新 次の日記(2006-01-23)» 編集

Route 477



2006-01-10

[javascript] 連想配列の罠

javascriptでは、オブジェクトのプロパティを動的に定義することができ、また以下の2つが同じ意味となる。

  • obj.prop
  • obj["prop"]

これを利用して、空のオブジェクトを連想配列のように扱うことができる。

hash = new Object();
hash["Alice"] = "apple";
hash["Bob"] = "orange";
document.write("Bob has an" + hash["Bob"]);

…と、巷の「javascript入門」とかには書かれているのだが、ちょっとした罠があることに気づいた。

空のオブジェクトにも "constructor" や "toString" といったプロパティが定義されているため、 空のオブジェクトを使っても、厳密には「空でない」連想配列になってしまうのである。

hash = new Object();
function check(key){
  if(hash[key] == undefined) error();
}
check("constructor");  // => error()は実行されない

連想配列のキーが「任意の文字列」で、「未定義のキー」が意味を持つコードを書きたいときって、どうすれば良いのかな? *1

*1 ちなみにfor..in使えば?というのは駄目です('constructor'等は列挙されない)。

本日のツッコミ(全2件) [ツッコミを入れる]
y.m. (2006-08-29 13:01)

お初にして亀レス。<br>if(!hash.hasOwnProperty(key)) error();<br>とすればいい。<br>constructor とか toString はプロトタイプが持っているので、オブジェクト本体は空だよ。

y.m. (2006-08-29 16:44)

あと、Netscape/Mozilla の独自拡張だけど、<br>hash.__proto__ = null;<br>としておけば、元の check 関数のままでもいける。