Dictionaryの挙動まとめ
AS3の連想配列、Dictionaryは、Objectと違って文字列以外もkeyにできるのだけど、色々な値を入れてみた。
空文字や、xmlの挙動がキモいと思います。
nullは残念ながら使えないようです。
使えないものは、黙ってStringに変換されるらしく、注意が必要。
objectをキーにしているとnullが混在することがあるわけで、エラーや脆弱性のもとになりそうだね。
/**
* 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("");
}
}
}