ActionScriptのDictionary型とObject型の違い

ActionScriptで,オブジェクトへの参照を配列のキーとして持ちたい場合がある.そんなときに使えるのがDictionary型だ.しかしながら,Dictionary型を使わなくてもObject型にもオブジェクトへの参照をキーとして持たせられるように見えた.

FN0912002 - Dictionary()コンストラクタ - Flash : テクニカルノート には,Dictionary型の特徴は,オブジェクトへの参照をキーとして持てることだと書いてある.そこで,両者の違いを調べるために,簡単なコードを書いてみた.コードは以下のとおり.

package
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.utils.Dictionary;
		
	public class ActionScriptTest extends Sprite
	{
		
		public function ActionScriptTest()
		{
			
			var myObj:Object = new Object();
			var mc:MovieClip = new MovieClip();
			mc.name = "hoge";
			
			var mc2:MovieClip = new MovieClip();
			myObj[mc2] = mc;
			
			trace(myObj[mc2].name); // hoge
			
			var mc3:MovieClip = new MovieClip();
			trace(myObj[mc3].name); // hoge

			trace(myObj['[object MovieClip]'].name); // hoge
			
			var dic:Dictionary = new Dictionary();
			dic[mc2] = mc;
			trace(dic[mc2].name); // hoge
			trace(dic[mc3].name); // error!!
			
			
		}
	}
}

このコード中では,myObjにおいてmc2のオブジェクトへの参照をキーとして使って,mcへの参照を作っている.
期待する動作としては,mc2への参照をキーとして使ったときのみmcへとアクセス可能な状態ができていて欲しい.
しかしながら,実際にはmc3を用いたときにもmcへとアクセスできてしまう.Object型においてオブジェクトの参照をキーとして使ったときは,そのオブジェクトの文字列表現か何かを使うことになる.例えば,MovieClip型のオブジェクトをtraceすると,どのMovieClip型に対しても[object MovieClip]と表示される.そして,その文字列表現が同じとみなされるため,mc2を添字にしても,mc3を添字にしてもmcにアクセスできたのだろう.

一方,Dictionary型の方ではmc2とmc3を添字にした場合でははっきりと区別される.上記のコードのtrace(dic[mc3].name);の部分ではちゃんとエラーが出てくれることからも区別されていることが分かる.

ということで,オブジェクトへの参照を使うときはDictionary型を使いましょう.