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'等は列挙されない)。
お初にして亀レス。<br>if(!hash.hasOwnProperty(key)) error();<br>とすればいい。<br>constructor とか toString はプロトタイプが持っているので、オブジェクト本体は空だよ。
あと、Netscape/Mozilla の独自拡張だけど、<br>hash.__proto__ = null;<br>としておけば、元の check 関数のままでもいける。