function f(a:uint, b:Object):void
{
a = 1;
b.n = 2;
}
var n:uint = 0;
var o:Object = new Object();
o.n = 0;
f(n, o);
trace(n);
trace(o.n);
0
2
プリミティブ型(数値など)は値渡し、複合型(オブジェクトなど)は参照渡しされます。値渡しされた変数をいじっても元の変数は変化しませんが、参照渡しされた変数をいじると元の変数にも反映されます。
var a:uint = 1;
{
var a:uint = 2;
trace(a);
}
trace(a);
2
2
他言語に慣れている人にとっては予期しない結果かもしれませんが、ECMAScriptのブロックには新しいスコープを生成する機能はありません。
var a:Number;
var b:int;
var c:uint;
var d:Boolean;
var e:Object;
trace(a);
trace(b);
trace(c);
trace(d);
trace(e);
NaN
0
0
false
null
それぞれの型のデフォルト値です。同じ数値型でも、Numberとint/uintではデフォルト値が違います。
function f(g:Function):void
{
var b:uint = 2;
g();
}
var a:uint = 0;
var b:uint = 1;
f(function ():void
{
trace(a);
trace(b);
});
0
1
ECMAScriptのクロージャは、「定義された位置に基づいて」決定されます。なので無名関数はグローバル上の変数しか参照できず、関数f内の変数bは参照できません。
var obj:Object = [1, 2, 3];
trace(obj as Array);
trace(obj as Number);
trace(obj as String);
1,2,3
null
null
ActionScript3から導入されたas演算子は、キャストのための演算子です。通常のキャストとの違いは、キャスト不可能な型が与えられた場合、TypeErrorがスローされるのではなく、nullが返るところです。
Copyright © ITmedia, Inc. All Rights Reserved.