ActionScript 3.0の解説書は、変数や関数にはデータ型を指定しましょうと説きます。もっとも、型指定しなくても、文法上は問題なく動きます。そうであれば、なぜわざわざしなくてもいい手間をかけるのでしょうか。それは、データ型が定められていると、スクリプトの誤りを減らすことができ、その質も高められるからです。利点は大きく3つ挙げられます。
【型指定の利点】
- 処理が最適化される
- 型チェックによるエラーが返される
- コードヒントが表示される
○01-01-01 変数と関数への型指定の仕方
利点の理由を説明する前に、変数や関数に対する正しい型指定の仕方を、簡単に確かめておきましょう。まず、変数はvar宣言するとき、変数の後のコロン(:)に続けてデータ型を添えます。
var 変数:データ型;
変数 = 値;
変数の宣言と初期値の代入は、1行のステートメントで済ませることもできます。
var 変数:データ型 = 値;
スクリプト01-01-001【○】変数にデータ型を正しく指定
- var i:int; // 初期値は代入しなくてもよい(int型のデフォルト値は0)
- var my_str:String = "text";
|
スクリプト01-01-002【×】変数にデータ型の指定がないと最適化されない
- var i;
- var my_str = "text";
|
つぎに関数の引数は、変数と同じく、後のコロン(:)に続けてデータ型を指定します。また、関数呼出しの括弧()の後にコロン(:)をつけると、戻り値の型指定ができます。戻り値がないときは、voidをデータ型とします。
function 関数(引数:データ型):戻り値のデータ型 {
// 処理内容
return 戻り値;
}
スクリプト01-01-003【○】関数の引数と戻り値に正しくデータ型を指定
- function add(i0:int, i1:int):int {
- return i0 + i1;
- }
|
スクリプト01-01-004【×】関数の引数と戻り値にデータ型の指定がないので最適化されない
- function add(i0, i1) {
- return i0 + i1;
- }
|
実践の例としては、後述03-01-01のようにforループなどの「繰返し処理のカウンタ変数は整数型で指定する」ことが挙げられます(後述03-01-02「Array.lengthプロパティの値は予め変数にとる」も、併せてご参照ください)。カウンタ変数をはっきりと整数(intまたはuint型)で指定することにより、繰返し処理は速めることができます。
スクリプト01-01-005【○】カウンタ変数を整数型で指定してプロパティ値も変数にとる
- var nLength:uint = my_array.length;
- for (var i:uint = 0; i < nLength; i++) {
- var element:Object = my_array[i];
- trace(element);
- }
|
スクリプト01-01-006【×】カウンタ変数に型指定がなくプロパティ値を繰返し参照
- for (var i = 0; i < my_array.length; i++) {
- var element:Object = my_array[i];
- trace(element);
- }
|
Basics 01-01-002■forステートメントを使ったループ処理
forステートメントを使ったループ処理の基本については、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第23回「クラスのデザインとループ処理」<http://gihyo.jp/dev/serial/01/as3/0023>の「ループ処理で複数のインスタンスを生成する」(4ページ)をお読みください。
|
Tips 01-01-001■データ型とデフォルト値
データ型を指定した変数に初期値を与えないと、デフォルト値として扱われます。ActionScript 3.0で使われるデータ型と、そのデータ型を指定した場合のデフォルト値および取りうる値は、次表01-01-001のとおりです([ヘルプ]の[ActionScript 3.0の学習]<http://help.adobe.com/ja_JP/as3/learn/>/[ActionScript言語とシンタックス]/[データ型]/[データ型の記述]参照)。
表01-01-001■データ型とデフォルト値
データ型 |
デフォルト値 |
値 |
*(なし) |
undefined |
任意の値 |
Boolean |
false |
trueまたはfalse |
int |
0 |
32ビット符号付き整数 |
Null |
型指定に用いることはできない |
null |
Number |
NaN |
64ビット浮動小数点数 |
String |
null |
16ビット文字列 |
uint |
0 |
32ビット符号なし整数 |
void |
undefined |
undefined |
クラス(リファレンス型データ) |
null |
クラスのインスタンス |
String型データのデフォルト値がnullであることには、注意しなければなりません。nullに対しては、Stringクラスのプロパティやメソッドへのアクセスが許されません(図01-01-001上図)。また、String型のプロパティに代入しようとしても、[コンパイルエラー]になることがあります(図01-01-001下図)。詳しくは、F-site「変数には初期値を与える」<http://f-site.org/articles/2010/07/31041620.html>をご参照ください。
図01-01-001■nullはプロパティ・メソッドにアクセスできずString型プロパティに代入もできない




nullを参照してクラスのプロパティやメソッドにはアクセスできず、String型のプロパティにも代入できない。
|
|
○01-01-02 型指定はバイトコードを最適化する
FlashのActionScriptは、記述したままで直ちには実行できません。スクリプトは一旦SWFに書出す(コンパイルする)必要があります。このとき、ActionScriptは記述したコード(ソースコード)のまま書出されるのでなく、「バイトコード」と呼ばれるFlash Player向けの命令に変換されます。その命令は、MacintoshやWindowsといったプラットフォームを問わず共通のSWFファイル形式で、Flash Playerのいわば通訳を必要とします。バイトコードは、ソースコードとコンピュータが実行する機械(マシン)語(ネイティブコード)の中間言語にあたります。
Word 01-01-001■バイトコード
「バイトコード」とは、特定のオペレーティングシステム(OS)やハードウェアに依存しない命令で記述されたプログラムです。ソースコードとネイティブコードの中間の形式に当たります。命令をすべて1バイトで表現し、プログラムのサイズを小さく抑えていることから、バイトコードと呼ばれるようになりました。
バイトコード形式のプログラムを動作させるには、バイトコードを解釈してその環境のネイティブコードに変換する「仮想マシン」と呼ばれるソフトウェアが必要です。Flash Playerは、この仮想マシンの役割を果たします。アプリケーションをバイトコードで配布すれば、仮想マシンが実装されているOS上なら、環境を問わずにそのアプリケーションを実行できることが利点です。
バイトコード形式をサポートしているプログラミング言語の代表はJavaです。そのため、Javaのバイトコード(Javaバイトコード)のことを単に「バイトコード」と呼ぶこともあります。
|
ActionScript 3.0は、Flash Playerの最適化されたAVM2(ActionScript Virtual Machine 2)で動作します(図01-01-002)。そして、SWFファイルに書出されたActionScript 3.0のバイトコードを、Flash PlayerのAVM2が解釈・実行します。データ型を指定すると、AMV2が型の情報にもとづいてデータを扱うようバイトコードは最適化されるのです。そのため、パフォーマンスが高まり、使うメモリも少なくできます。
図01-01-002■ActionScript 3.0はAVM2上で動作する
Flash Player 9以降に備わったAVM2が、ActionScript 3.0を解釈・実行する。
|
○01-01-03 型のチェックとコードヒント
型指定による恩恵は、処理の最適化だけではありません。指定されたデータ型にもとづき、コンパイル(SWF書出し)時とランタイム(Flash Player上での動作時)に型のチェックが行われます。そして問題があると、エラーとしてその情報が示されます。それを手がかりにすれば、早期に問題が解決できます。
また、データ型を指定するとデフォルトでは、使えるプロパティやメソッドが「コードヒント」として自動的に表示されます(図01-01-003)。これにより、スクリプティングが楽になるだけでなく、間違いを防げます。
図01-01-003■データ型を指定すると「コードヒント」が表示される
指定したデータ型に応じて、使えるプロパティやメソッドがリストされている。また、Flash Professional CS5からはimport宣言が自動的に加えられる。
|
Tips 01-01-002■Flash Professional CS5のコードヒントとimport宣言
Flash Professional CS5からは、型指定をするとimport宣言が自動的に加えられるようになりました(前掲図01-01-003参照)。また、new演算子の後のコンストラクタメソッドも、コードヒントから選べます(F-site「コードヒントとimport宣言」<http://f-site.org/articles/2010/05/22011806.html>参照)。なお、カスタムクラスについても、型指定をすればコードヒントが表示されます。
|
○01-01-04 Objectよりもカスタムクラスを定義する
Objectインスタンスには、複数のプロパティを自由につくって値が入れられるので便利です。けれども逆に、設定できるプロパティを予め決めたり、データ型の指定ができません。つまり、最適化を考えたときに不満が生じます。たとえば、ID番号の整数と名前の文字列を納めたオブジェクトがほしいとします。Objectインスタンスでは、ID番号と名前を入違っても、プロパティにデータ型が指定できないので何もエラーは起こりません(図01-01-003)。
スクリプト01-01-007【△】Objectインスタンスは便利なもののプロパティに型指定できない
- var myData:Object = {};
- myData.id = 1;
- myData.firstName = "fumio";
|
図01-01-003■Objectインスタンスのプロパティにはデータ型が指定できない

ID番号のプロパティに文字列、名前のプロパティに数値を入れても、データ型が指定できないのでエラーは起こらない。
|
クラスの定義をすでに学習された方は、このような場合データを納めるためのクラスをつくればよいでしょう(スクリプト01-01-008)。クラスのプロパティにはデータ型が指定できます(第6〜7行目)。ドットアクセスすれば強い参照になるので、処理が最適化されます。もちろん、型のチェックも行われます(図01-01-004)。
スクリプト01-01-008【○】カスタムクラスを定義すればプロパティが型指定できる
- var myData:PersonalData = new PersonalData();
- myData.id = 1;
- myData.firstName = "fumio";
|
クラス定義
- package {
- public class PersonalData {
- public var id:uint;
- public var firstName:String;
- public function PersonalData() {}
- }
- }
|
図01-01-004■クラスのプロパティはデータ型が指定できる

型指定したプロパティにはチェックが働くので、データ型が違えば[コンパイルエラー]になる。
|
作成者: 野中文雄
更新日: 2011年2月14日 表01-01-001に、データ型として*(なし)を加えた。
更新日: 2011年1月23日 スクリプトに連番と行番号を追加。基礎知識としてのgihyo.jpのリンクをBasicsとした。
更新日: 2011年1月20日 Linksを追加。
更新日: 2011年1月15日 例のタイトルを具体化。
作成日: 2010年10月19日