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;