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;