Dead Code Preservation :: Archived AS3 works from wonderfl.net

Dictionaryの挙動まとめ

AS3の連想配列、Dictionaryは、Objectと違って文字列以外もkeyにできるのだけど、色々な値を入れてみた。
空文字や、xmlの挙動がキモいと思います。
nullは残念ながら使えないようです。
使えないものは、黙ってStringに変換されるらしく、注意が必要。
objectをキーにしているとnullが混在することがあるわけで、エラーや脆弱性のもとになりそうだね。
Get Adobe Flash player
by tail_y 04 Sep 2011

    Talk

    tail_y at 04 Sep 2011 04:18
    野中さんの指摘により、Number値が実はStringになってたので、失敗の項目へ移動。
    tail_y at 04 Sep 2011 04:22
    早い話が、プリミティブは全部文字列扱いのようで。
    Embed
/**
 * Copyright tail_y ( http://wonderfl.net/user/tail_y )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jsXD
 */

package {
    import flash.display.Sprite;
	import flash.utils.Dictionary;
	import flash.text.TextField;
    public class FlashTest extends Sprite {
        public function FlashTest() {
			var i:int;
			var dictionary:Dictionary = new Dictionary();
			dictionary["a"] = i++;	// 普通の使い方
			
			dictionary[""] = i++;	// 有効
			
			dictionary["\n"] = i++;	// 有効
			
			var keyObject:Object = {};
			dictionary[keyObject] = i++;	// 有効。独立して管理されてる。
			
			var keyObject2:Object = {};
			dictionary[keyObject2] = i++;	// 有効。独立して管理されてる。
			
			dictionary["[object Object]"] = i++;	// String表現が一緒でも上書きしない
			
			var func:Function = function ():void{};
			dictionary[func] = i++;	// 有効
			
			dictionary[function ():void{}] = i++;	// 有効
			
			dictionary[trace] = i++;	// 有効
			
			dictionary[<xml />] = i++;	// 有効
			
			dictionary[<xml />] = i++;	// 有効(上とは独立して扱われる)
			
			dictionary[[]] = i++;	// 有効(ただし、typeofではobjectとなる)
			
			dictionary[[]] = i++;	// 有効(上とは独立して扱われる)
			
			dictionary[new <int>[]] = i++;	// 有効(Arrayと挙動は同じ感じ)
			
			// ここから失敗ケース
						
			dictionary[1] = i++;	// 有効だが、扱いは文字列のようだ(typeOfではnumberと出る)

			dictionary[int(1)] = i++;	// 上を上書きしている。
			
			dictionary["1"] = i++;	// 上を上書きしている・・・。

			dictionary[0.5] = i++;	// 文字列に変換されてしまう

			dictionary["0.5"] = i++;	// 上を上書きしている。

			
			dictionary[null] = i++;	// 文字列に変換されてしまう
			
			dictionary["null"] = i++;	// 上を上書きして消してしまっている
			
			dictionary[undefined] = i++;	// 文字列に変換されてしまう
			
			dictionary["undefined"] = i++;	// 上を上書きして消してしまっている
			
			dictionary[Infinity] = i++;	// 文字列に変換されてしまう
			
			dictionary["Infinity"] = i++;	// 上を上書きして消してしまっている
			
			dictionary[NaN] = i++;	// 文字列に変換されてしまう
			
			dictionary["NaN"] = i++;	// 上を上書きして消してしまっている
			
			dictionary[true] = i++;	// 文字列に変換されてしまう
			
			dictionary["true"] = i++;	// 上を上書きして消してしまっている
			
			
			var tf:TextField = new TextField();
			addChild(tf);
			tf.width = tf.height = 400;
			
			var strList:Array = [];
			for (var key:Object in dictionary) {
				strList[dictionary[key]] = key + " (type=" +typeof(key)+ ") = " + dictionary[key] + "\n";
			}
			tf.text = strList.join("");
        }
    }
}