Dictionaryオブジェクトは、参照をキーとして値が設定できることに特長があります(詳しくは、「Dictionaryクラスを使ってみる」をお読みください)。しかし、プリミティブ値もキーとして使えます。その場合、Dictionaryオブジェクトのキーの扱いが少し違ってくるようです。なお、参照とプリミティブの違いについては、「Stringはプリミティブ値かオブジェクトか」2「ActionScript 3.0の場合」をご参照ください。
少々マニアックなこのお題については、tail_y(尾野)さんがwonderflに「Dictionaryの挙動まとめ」を投稿されました。そこで、この結果をもとに簡単な説明を加えます。
DictionaryクラスはもちろんObjectクラスを継承します。そして、前出「Dictionaryクラスを使ってみる」に述べたとおり、「Objectインスタンスは文字列の識別子を用い」て値が加えられます。Dictionaryオブジェクトにプリミティブ値のキーを定めるとObjectインスタンスとしてふるまい、キーは文字列に変換して値を納めるようです(表001)。
表001■DictionaryオブジェクトのふたとおりのふるまいObjectインスタンスとしてのふるまい | プリミティブ値のキーは文字列に変換する | |
キー | データ型 | 値の例 |
文字列 |
String (未定義値はNull)[*1] |
"a"、""(空文字列)、"\n"(改行)、"[object Object]"({}.toString()) |
数値 | Number、int、uint | 1、int(1)、0.5、NaN、Infinity |
ブール(論理)値 | Boolean | true |
未定義値 | Null、void | null、undefined |
Dictionaryインスタンスとしてのふるまい | リファレンス型データは参照をキーにする | |
キー | データ型 | 値の例 |
オブジェクトや配列など | Object、Array、Vectorなど | {}、[]、new <int>[] |
XMLデータ | XML | <xml /> |
関数 | Function | function ():void {}、trace |
先に、Objectインスタンスとしてのふるまいを確かめましょう。文字列のキーには、改行コード("\n")や空文字列("")も使えるようです。数値のキーも文字列に変換されます。したがって、数値と文字列の数字は区別されません。NaNやInfinityなどの特別な値も、そのまま文字列としてキーになります。ブール値や未定義値も同じです。
つぎに、Dictionaryオブジェクトにリファレンス型データ(オブジェクト)をキーに定めると、その参照に対して値が設定されます。オブジェクトや配列などをキーにすると、たとえ中身(プロパティやエレメント)の値は同じでも参照が異なれば別に扱われます。XMLデータもオブジェクトですので、ノードデータは空であってもその参照がキーになります。関数もキーにすることができます。
Dictionaryオブジェクトを使いながら、あえてプリミティブ値をキーにすることは少ないと思われます。けれど、一般にオブジェクトで型指定した場合の未定義値はnullです。初期値を必ず与えるといった注意はした方がよいでしょう。
[*1]「変数には初期値を与える」参照。