(メインページへ)
3. ActionScriptのシンタックス/3.4 データ型

3.4 データ型

データ型の種類

データ型は、実際の値をもつプリミティブ型と値への参照だけのリファレンス型の2種類に分けることができます。さらにこの2種類に加えて、特殊なデータ型としてnull(値なし)とundefined(型未定義)があります。
プリミティブ型にはString、Number、Boolean、定数があります。

データ型    値の例
String → "test"、 "こんにちは"
Number → 123、42、0.32、21e4
Boolean → true、false

-123などのマイナスの値もNumber型ですが、+-は符号を示す演算子です。定数はMath.PIやKey.Rightなどですが、実際の値が何であるかによって型が決まります(実際のところすべてはNumber型です)。
リファレンス型にはMovieClip、objectがあります。ムービークリップのインスタンスがMovieClip型です。Object型の値には、ObjectクラスやDateクラスなどのクラスから生成したインスタンスに加えて、[1, 2, 3, 4]、{name:"chan", age:21}などの配列演算子を使って作った値があります。

Object型の値
v1 = [1, 2, 3, 4];
v2 = {name:"chan", age:21};
v3 = new Array(1, 2, 3);
v4 = new Date(2004, 6, 7);
v5 = new Object();


図3-4-1 データ型の種類

■データ型のチェック
値のデータ型をチェックするにはtypeof演算子を使います。返される値はデータによって次のようになります。

ストリング → string
ムービークリップ → movieclip
ボタン → object
テキストフィールド → object
数値 → number
ブール値 → boolean
オブジェクト(インスタンス) → object
関数 → function
null → null
未定義 → undefined


例:
trace(typeof "test"); //出力→ string
trace(typeof 123); //出力→ number
trace(typeof ([1, 2, 3, 4])); //出力→ object
usr = {name:"chan", age:21};
trace(typeof usr.name); //出力→ string
today = new Date();
trace(typeof today); //出力→ object

nullとundefinedも同様です。

例:
trace(typeof null); // null
trace(typeof x); // 変数xをいきなり使用したのでundefined


型に応じて処理を振り分けるといった場合には、"string"、"number"、"object"のようにストリングで比較します。

例:
v = "test";
if (typeof v == "string") {
 trace("vはストリング");
}

個別リンク | コメント (0) | トラックバック

データ型の変換

文字列(String)の"123"を数値(Number)の123として計算したいというように、値のデータ型を変換したい場合があります。そのような場合に次のような変換方法があります。
ただし、元の値がどう変換されるかについては元のデータ型などによって違うので注意してください。また、Flash 6以前とFlash 7では結果が同じでないものがあります。

■文字列(String)への変換
ある値をストリングに変換するには、Number.toString()メソッド、Object.toString()メソッド、String()関数を使います。

例:
x = 12;
y = x + 3;
trace(y); // 15
x = x.toString(); // "12"
y = x + 3;
trace(y); //出力→ "123"

例:
x = 12;
y = String(x) + 3;
trace(y); //出力→ "123"

例:
a = [1,2,3];
as = a.toString(); // "1,2,3"

また、次のように値を別のストリングと連結することで全体がストリングになります。空のストリング""の連結でもかまいません。

例:
age = 18;
usr = "ゆき" + age + "才";
trace(usr);// 出力→ ゆき18才


■数値(Number)への変換
ある値を数値に変換するには、Number()、parseInt()、parseFloat()の関数を使います。parseInt()は整数に変換し、parseFloat()は浮動小数点に変換します。

例:
v = Number("123.4"); // 123.4
v = Number(true); // 1
v = Number(false); // 0
v = Number("12円"); // NaN

例:
v = parseInt("123.6"); // 123
v = parseInt(true); // NaN
v = parseInt(false); // NaN
v = parseInt("12円"); // 12
v = parseInt("車5台"); // NaN
v = parseInt("3.56e+8"); //3

例:
v = parseFloat("123.4"); // 123.4
v = parseFloat("3.56e+8"); // 356000000

また、次のように値から0を引くという方法でも値を数値に変換することができます。

例:
v = "123" - 0;
trace(v); //出力→ 123
trace(typeof v) //出力→ number

■ブール値(boolean)への変換
ある値を数値に変換するには、Boolean()関数を使います。値がtrue、falseのどちらに変換されるかは、元の値の種類で決まっています。

例:
v = Boolean(0); // false
v = Boolean(1); // true
v = Boolean(123); // true
v = Boolean("test"); // true
v = Boolean(null); // false
v = Boolean(undefined); // false


note:
スクリプトの実行の過程において、対象となる値が適切なデータ型ではなかったとき、その値は演算可能なデータ型の値に自動的に置き換えられて処理されます。

個別リンク | コメント (0) | トラックバック

厳密な型指定

ActionScriptではデータ型は適当に解釈されるためにデータ型を指定しなくても利用できます。しかし、場合によってはこの柔軟さがエラーの原因になったり、バグの発見を遅らせる要因になります。
変数や関数の引数、関数の戻り値に厳密なデータ型を設定すれば、コンパイル時にデータ型がチェックされるようになります。
また、データ型を指定すれば名前の接尾辞をつけなくとも式をタイプする際にピリオド(.)に続いてコードヒントが表示されるようになります。(コードヒント→p.??)
ただし、データ型がチェックされるのはスクリプトのコンパイル時だけなので注意が必要です。実行時に指定した以外の型のデータが与えられてもエラーになりません。

■変数のデータ型
変数に厳密なデータ型を指定するには、変数をvarで宣言しなければなりません。そして、変数名に続いてコロン(:)を書き、それに続けてデータ型を書きます。

例:
var myV:Number;
var myName:String;
var myData:Array;

この例のように変数のデータ型を設定した場合に次のスクリプトは「代入ステートメントでタイプが一致しません。」というコンパイルエラーになります。

例:コンパイル時にエラーになる
myV = "123";
myName = 2004;
myData = "test, 123";


図3-4-2 データ型が一致しないのでコンパイルエラーになります。

ただし、次のようなスクリプトではコンパイル時にvのデータ型を特定できずにエラーになりません。

例:
var v = 12;
var s:String = v; // エラーにならない

このようなケースをコンパイルエラーにするには、次のように変数vのデータ型も厳密に指定する必要があります。

例:
var v:Number = 12;
var s:String = v; // コンパイルエラーになる

■関数の引数のデータ型
関数の引数のデータ型を指定するには引数名に続けてコロン(:)を書き、それに続けてデータ型を書きます。なお、先にも書いたようにデータ型がチェックされるのはスクリプトのコンパイルです。ムービー再生中に関数が呼ばれるたびに引数のデータ型がチェックされるわけではないので注意してください。

例:
function nefuda(genka:Number, kinsyu:String) {
var ans:String = genka * 1.2 + kinsyu;
return ans;
}

この例ではnefuda()関数の1番目の引数は数値、2番目の引数はストリングでなければコンパイルエラーになります。

例:
nefuda_txt.text = nefuda("ドル" , 25); // コンパイルエラー
nefuda_txt.text = nefuda(190 , "円"); // OK

次のスクリプトでは引数の並びが逆でデータ型が一致しないのでコンパイルエラーになるように思えますが、変数の厳密なデータ型の指定の場合と同様にエラーになりません。

例:
g = 25;
k = "ドル";
nefuda_txt.text = nefuda(k, g); // エラーにならないので注意が必要

次のように変数g、kのデータ型が厳密に設定されていればエラーになります。

例:
var g:Number = 25;
var k:String = "ドル";
nefuda_txt.text = nefuda(k, g); // コンパイルエラー

sample → nefuda.fla

■関数の戻り値のデータ型
関数の引数だけでなく、戻りの値のデータ型を設定できます。たとえば、変数xのデータ型がNumberに設定されているとき、test()関数から戻る値のデータ型がわからないと変数xへの代入が妥当かどうか判断できません。そこで関数の戻りの値にもデータ型を設定しておきます。関数の戻りのデータ型を設定するには、引数を囲む()に続いてコロン(:)を書き、それに続けてデータ型を指定します。
次の例は、先のnefuda()の戻り値のデータ型をStringに設定しています。

例:戻り値のデータ型を定義する
function nefuda(genka:Number, kinsyu:String):String {
var ans:String = genka * 1.2 + kinsyu;
return ans;
}

関数の戻り値にもデータ型を設定すれば、変数への代入する時点でのデータ型の妥当性をチェックできます。

例:戻り値のデータ型がチェックされる
var lavel:String = nefuda(500, "円");


■メソッドのデータ型
メソッ定義では値を返しません。そこで、メソッド定義のデータ型はVoidにします。

例:メソッドのデータ型はVoidにする
fucrion move(target:MovieClip, x:Number, y:Number):Void {
target._x += x;
target._y += y;
}

■インスタンスのデータ型
クラスから作ったインスタンスは、そのクラスのデータ型をもちます。たとえば、Dateクラスから作ったmyDate、XMLクラスからmyXMLはそれぞれDate、XMLというデータ型を指定できます。ユーザーが定義したカスタムクラスでも同じです。MyClassクラスのインスタンスはMyClassデータ型になります。なお、インスタンスはObject型でもあるので、データ型としてObjectを指定することもできます。

例:インスタンスはクラスのデータ型になる
var myDate:Date = new Date();
var myXML:XML = new XML();
var myObj:MyClass = new MyClass();

■オブジェクトのキャスト
キャストという手法を使うと、コンパイル時のデータチェックにおいて、オブジェクト(インスタンス)のデータ型を別のデータ型として認識させることができます。
キャストはtype(item)という形式をとります。たとえば、MyClass()というカスタムクラスがあったとき、あるデータをMyClassクラスのデータ型にキャストしたい場合にはMyClass(data)のように書きます。これはString(x)、Number(y)などと共通した書式なのでわかりやすく利用できます。

個別リンク | コメント (0) | トラックバック