kagamihogeの日記

kagamihogeの日記です。

Flex の Object と Dictionary のちがい

Flex というか ActionScript 3.0 の話なんだけど。そろそろ ActionScript のタグ作った方がいいかなぁ。

ActionScriptJava でいうところの Map というか、連想配列というか、まぁそういうのを作るときは Object を使うらしいことを最近知った。

こんな感じ。

var o:Object = new Object();
var value:Object = new Object();
o["key"] = value;
trace(o.hasOwnProperty("key"));

で、Flex のリファレンスを見ると flash.utils.Dictionary という似たようなものがある。Object 使ったやり方と何か違うんかねぇ、と思ったのでちょっと実験。

まず、比較用に Object 使ったやり方。

var key:Object = new Object();
var obj:Object = new Object();

key.toString = function() {return "HOGEHOGE"};

obj[key] = "c";

trace(obj.hasOwnProperty("HOGEHOGE")); //true
trace(obj.hasOwnProperty("key"));      //false
trace(obj.hasOwnProperty(key));        //true

次に、Dictionary を使ったやり方

var key:Object = new Object();
var dic:Dictionary = new Dictionary();

key.toString = function() {return "HOGEHOGE"};

dic[key] = "c";

trace(dic.hasOwnProperty(key));        //false
trace(dic.hasOwnProperty("key"));      //false
trace(dic.hasOwnProperty("HOGEHOGE")); //false

とまぁ、結果はこんな感じ。ものっそい大雑把に言うと……

  • Object は、オブジェクトの toString をキーにする
  • Dictionary は、オブジェクトそのものをキーにする

Object は、キー値を空気を読んでテキトーに処理してくれちゃうけど、Dictionary はそうじゃない、ってとこですかね。まぁ、正確に言うとかなり間違ってるんだけどw

正確な表現を書くのは結構骨が折れるんで、flash.utils.Dictionary のドキュメントをまんま抜き出し引用。

Dictionary クラスでは、プロパティの動的なコレクションを作成し、キーの比較に厳密な等式(===)を使用できます。オブジェクトがキーとして使用されている場合は、オブジェクトの識別子を使用してオブジェクトを検索し、オブジェクトの toString() を呼び出して返される値は使用されません。Dictionary コレクション内の Numbers のようなプリミティブ(ビルトイン)オブジェクトは、通常のオブジェクトのプロパティであるときと同じように動作します。

flash.utils.Dictionary より抜粋

ActionScript には === という演算子が用意されてる、と。説明は  === strict equality 演算子 にある。そいや Ruby にもあったっけか、この演算子

とりあえず。Object にしろ Dictionary にしろ、キーに文字列以外を使用する場合はちょっと注意が必要なようですね。