Adobeの上条晃宏氏がCodeZineに「Java と ActionScript 3.0 の違い:文法編」を書かれました(Flexデベロッパーセンターより再掲)。興味深い記事ですので、ActionScript 3.0について気づいたことを少し付け加えてみます。
値がundefinedになる場合としては、存在しない配列エレメントやvoidの戻り値もあります。
var _array:Array = []; trace(_array[0]); // 出力: undefined trace(test()); // 出力: undefined function test ():void { }
プリミティブでは、String型のデフォルト値がnullであることに注意が必要です。String以外のたとえばint型であれば、デフォルトでもintクラスのメソッドが使えます。
var i:int; trace(i.toPrecision(2)); // 出力: 0.00
ところが、String型のデフォルト値nullに対しては、プロパティやメソッドにアクセスできず、ランタイムエラーになります。
var _str:String; trace(_str.toLowerCase()); // 出力: TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
また、nullはString型のプロパティに設定することもできません。
数値の型の間では、自動的に変換が行われます。たとえば、Number型の値をint型の変数に入れれば、整数に変換されます(とはいえ、きちんと型変換することが安心です)。
var f:Number = 5.5; var i:int = f as int; trace(i); // 出力: 0 i = f; trace(i); // 出力: 5
また、Arrayクラスについては、Array()関数でキャストすることはできません。このときは、as演算子を使いましょう。
instanceof演算子は、ActionScript 3.0でも一応は使えます。ただし、is演算子を用いるよう警告されます。また、instanceof演算子では、インターフェイスの実装は調べられません。
var _mc:MovieClip = new MovieClip(); trace(_mc is IBitmapDrawable); // 出力: true trace(_mc instanceof IBitmapDrawable); // false
Flash Professional CS5からは、エレメントを納めたVectorインスタンスが生成できるようになりました。