これらの3つの宣言に違いはありますか?
var x;
var y:Object;
var z:*;
ASにそうでないものはありObject
ますか?
これらの3つの宣言に違いはありますか?
var x;
var y:Object;
var z:*;
ASにそうでないものはありObject
ますか?
var x;
var x:*;
コンパイラにとってまったく同じことを意味します。変数は任意の型を受け入れることができます。:*
コードの可読性を高めるために、型を省略するのではなく使用してください。
var x:Object;
お気づきのように、すべてがObjectから派生しているため、実際には同等です。ただし、コンパイラはそれを異なる方法で処理し、オブジェクト以外のプロパティにアクセスしている場合は少し遅くなる傾向があります。さらに、他の回答で指摘されているようundefined
に、オブジェクトに割り当てようとすると、自動的ににキャストされnull
ます。
:*
変数が複数の無関係なタイプの値を受け入れることができる:Object
場合に使用し、オブジェクトを連想配列として使用する場合に使用することをお勧めします。
値を取得したい場合undefined
は、タイプを使用してください。Object
var
undefined
*
var a:*=undefined;
trace(a); // will trace undefined
var b:Object=undefined; // you will have a warning at compile time
trace(b); // will trace null
主な違いは、名前空間を*
割り当てることができるundefined
のに対し、Object
できないことです。他のすべては両方にとって問題ありません。
AVM内に多少の奇妙な点Object
があるため、可能な限り使用することをお勧めします。*
コードでは、xは入力されず、yはObjectクラス(すべてのActionScriptクラスの基本クラス)として入力され、zは任意のタイプのクラスとして入力されます。これの結果は、これらの変数のパブリックメンバーを参照する必要があるときはいつでも、使用しようとしているクラスのインスタンスとしてそれらをキャストする必要があるか、または(yオブジェクトの場合、その他の場合も)型なし変数)y.hasOwnProperty("propertyName")
参照する前にテストする必要があります。
通常、複数のタイプのクラスを取ることができるメソッド引数には*のみが表示されます。たとえば、次のようなイベントハンドラーがあるとします。
private function myHandler(event:*) : void {
//statements
}
ここで、eventは任意のタイプのイベントを参照でき、メソッドのコードは、それを使用して何かを行う前に、どのタイプであったかを判別します。