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

August 19, 2010

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.();
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;

tilfin freelance software engineer