ActionScript の Array は dynamic オブジェクトな件

Java を書いてから、ActionScript 3 に戻ると、改めてプロトタイプベースであることを感じることがあります。
今日も Array に関してそんなネタがあったのでメモ。

var array:Array = new Array();
array["sss"] = 20;
array[-1] = "Aaa";

上記はいずれも通ります。ちなみに負の添え字でセットしても length は 0 のままです。

var array:Array = new Array();
trace(array[10]);

上記は RangeError にならず、undefined が返ります。Vector だと RangeError になります。

var array:Array = new Array();
array[100] = "item";
trace(array["100"]);

上記のように添え字を文字列しても、ちゃんと item が返ります。length は 101 となり、0〜99までの要素は undefined になります。

var array:Array = new Array();
array[100] = "item";
trace(0 in array);  // false;
trace(100 in array);  // true;

in 演算子を使って添え字の要素がセットされているか確認できます。

var vector:Vector.<String> = new Vector.<String>();
vector.push("hoge");
trace(0 in vector);   // true
trace(10 in vector);  // false

Vector でも in 演算子を使って添え字の要素がセットされているか確認できます。

Array は public dynamic Array extends Object なのです。

つまり、Array の走査(アクセサ処理)は Object の 動的プロパティのそれと同様であるため速くないようです。速さを求めるには Vector を使いましょう。

最後に応用です。例えばこんな書き方ができます。

var str:String = (array.length > 10) ? array[10] : null;

は次のように書けます。

var str:String = array[10] as String;