[AS3] Dictionaryオブジェクトのキーにプリミティブ値を指定した場合 [Edit]

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")や空文字列("")も使えるようです。数値のキーも文字列に変換されます。したがって、数値と文字列の数字は区別されません。NaNInfinityなどの特別な値も、そのまま文字列としてキーになります。ブール値や未定義値も同じです。

つぎに、Dictionaryオブジェクトにリファレンス型データ(オブジェクト)をキーに定めると、その参照に対して値が設定されます。オブジェクトや配列などをキーにすると、たとえ中身(プロパティやエレメント)の値は同じでも参照が異なれば別に扱われます。XMLデータもオブジェクトですので、ノードデータは空であってもその参照がキーになります。関数もキーにすることができます。

Dictionaryオブジェクトを使いながら、あえてプリミティブ値をキーにすることは少ないと思われます。けれど、一般にオブジェクトで型指定した場合の未定義値はnullです。初期値を必ず与えるといった注意はした方がよいでしょう。


[*1]「変数には初期値を与える」参照。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事