2012-03-06 24 views
3

Object(null)を使用してオブジェクトにnullをキャストすると、結果はオブジェクトになります。Object(null)をnullにしないのはなぜですか?

Object(undefined)を使用して未定義オブジェクトをオブジェクトにキャストすると、結果はオブジェクトになります。

しかし、null as Objectまたはundefined as Objectはnullのままです。

これはなぜですか?私はこれについてのドキュメントで何も見つけることができません。

これらのキャストに起因するオブジェクトは、プロパティを設定して読み込むことができます。これは、キャストが情報を作成したかのように、またはnullundefinedの値にある特別な情報を削除したものです。しかし、AS3のドキュメントには、nullundefinedの特殊タイプが実際にオブジェクトであることは示されていません。

+0

簡易回答?それはフラッシュなので、フラッシュは悪いです。後括弧付きの型を書くことは新しいオブジェクトを宣言しており、コピーまたは再解釈型キャストのコンストラクタパラメータとしてnullを渡しています。基本的にvar o = new Object(null);と同じです。あなたはまだオブジェクトを作成しています。 –

+6

あなたは@AscensionSystemsの半分です。 Objectを作成していますが、結果が同じであっても 'new Object()'を呼び出すのと同じではありません。理解しておくべき最も重要なことは、 'Object(something)'は型キャストではないということです。*オブジェクトの* Object値*を返そうとする、 'Object'と呼ばれるトップレベル関数*を呼び出します。そして、それが分かるように、 'null'のObject値は空のObjectです。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package.html#Object() – weltraumpirat

+0

実際にnullとundefinedが何であるかを理解する必要があります。 Nullは、変数が宣言されていても値を持たない場合です。変数が宣言されていない場合は未定義であり、コンパイラエラーが発生します。トレース(null ==未定義); // trueとtraceを出力します(null ===未定義)。 // Outputs false –

答えて

3

2つのキャスティング技術に違いがあります。 http://upshots.org/actionscript-3/as3-casting-objects

実際にはObject(null)はnullをObjectに変換し、asはnullをObjectとして扱うことができるかどうかを確認しようとします。

+0

[1]およびnullおよび未定義型のドキュメントによると、nullはObject型の変数の有効な値ですが、undefinedはそうではありません。 Object(未定義)が動作する理由は、おそらくundefinedが暗黙的にnullに強制されるからです。しかし、Object(null)キャストは、null値を標準オブジェクトインスタンスに変換する際になぜ成功しますか?私は別のnull値、ヌル参照、または何らかの変換エラーを与えることを期待しています。 [1] http://help.adobe.com/en_US/as3/learn/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9c.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7fda – ivanreese

+0

私はあなたの答えの終わりの部分に同意します。 ASキーワードは、RTTIを呼び出して、キャストされているオブジェクトが目的のキャストタイプで継承チェーンを共有し、可能であればキャストを実行するかどうかを確認します。私はVMがNULLをオブジェクトに変換する部分に同意しません。 VMは単に新しいオブジェクトを割り当て、オブジェクトを構築するためのNULLまたは0のパラメータを仮定します。未定義と同じです。 –

3

最初にStringと説明する方が簡単です。

は、我々はこれを行うとしましょう:たまたま

var v:* = null; 
var s:String = v; 

何? snullになります。 nullは、タイプStringの参照に対して有効な値です。代わりに、今

:今、何が起こる

var v:* = null; 
var s:String = String(v); 

s"null"になります。明示的にタイプStringのオブジェクトを要求していますが、nullのタイプはNullなので、変換する必要があります。 nullStringに変換され、"null"です。

123.45Stringに変換すると、"123.45"になります。けっこうだ。

次に、Objectを試してみましょう。

var v:* = null; 
var obj:Object = v; 

objnullになります。今

: - nullではありません。ここ

var v:* = null; 
var obj:Object = Object(v); 

は再び我々は、明示的にタイプObjectの値を指すようにobjのために求めています。 nullObjectに変換すると、空のオブジェクトになります。

さんが再び見てみましょう。ここでは

var s:String = null; 

タイプStringsがタイプNullの値nullを指しているの参照を。

参照String、値Null

String基準は、Null値を取ることができ、それは(すなわち0に)変換されなければならないNumbernullを割り当てるときNumber参照ので、Null値を取ることができません。

var n:Number = Number(null); // 0 

参考文献と値の面では本当に役立ちます。

キャストは参照のためのキャストであることを覚えておくと、変換は値です。 Object(value)は変換です。 (value as Object)はキャストです。

最後に、ユーザー定義型を試してみましょう。その後

class Person {} 

:あなたが期待するよう

var person:Person = null; 

はここpersonは、nullになります。

しかし:

var person:Person = Person(null); 

personは再びnullになります!私たちはPersonを求めましたが、Nullがあります。どうして?

nullPersonに変換できません。このような場合、結果は目的のタイプのデフォルト値になります。 Personのデフォルト値はnullです。

これはNumberにも変換されています。

var n:Number = Number("123.45"); 

n123.45になります。

var n:Number = Number("The quick brown fox, period."); 

nは、NaNとなる。

文字列"The quick brown fox, period."Numberに変換できないため、Numberのデフォルト値はNaNです。これは、nullNumberに変換し、0とする前の例とは対照的です。

私は続けることができます。

疑問がある場合は、asオペレータを使用してください。value as Typeは基本的にvalue is Type ? value : nullになります。覚えておく複雑なルールはありません。 1つのタイプの値を別のタイプの値に変換する場合にのみ、Type(value)を使用してください。

+0

あなたの答えからいくつかの引用符があります: "Objectに変換されたnullは空のオブジェクトです"、および: "値nullはPerson型に変換できません。 Personの値はnullです。 私はこれら2つのステートメントの背後にある論理を一貫した理解に結びつけることはできません。私は、型のインスタンスではなく、他の型(Personの例のような)へのnullのキャストがまだnullである理由を知ります。それは完璧な意味合いがあります。しかし、Objectにnullをキャストするのはなぜですか? – ivanreese

+0

さらに、「ActionScript 3.0では、Objectクラスのインスタンスのデフォルト値は、[1]から:」、「ActionScript 3.0のすべての値はオブジェクトです。つまり、値は[2]からその値を返します。 [1] http://help.adobe.com/en_US/as3/learn/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9c.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7fda [2] http://help.adobe.com/en_US/FlashPlatform/reference /actionscript/3/package.html#Object() – ivanreese

+0

@spiralganglionこれは「キャスト」ではなく、コンバージョンです。'Type(value)'を考えてみましょう。ステップ:(1) 'value'を' Type'に変換しようとします。 (2)それが失敗した場合、デフォルト値を使用します。 'Object(null)'では、ステップ1が成功します! 'Person(null)'では失敗します。 'Object'のデフォルト値は' null'ですが、変換が成功するとデフォルト値は必要ありません。 – Manish

関連する問題