2011-07-29 7 views
14

"in"演算子と "hasOwnProperty"メソッドは互換性があるように見えますが、継承されたプロパティや何かをチェックしていて、他のものがそうでないかどうかは疑問です。私は特に辞書でそれを使用する場合に興味がありますが、他の用途とは異なることは疑いがあります。Actionscript 3では、 "in"演算子と "hasOwnProperty"メソッドの違いは何ですか?

"hasOwnProperty"は公式ドキュメントhereに記載されていて、 "in"はhereと記載されていますが、違いがあればわかりません。

答えて

14

本当に受け入れられた答えを信頼すると、実際に私は少しのトラブルに陥りました。プロトタイプに関連した違いだけではないようです。私が見つけたのは

hasOwnPropertyは、そのキーが参照型であるにもかかわらず、in演算子であることができるかどうかを見るために使用することはできません。

ここに示す例があります。

コード:

var test:Function = function(key:*,label:String):void 
    { 
     var d:Dictionary = new Dictionary(true); 
     d[key] = true; 
     trace(label); 
     trace(" hasOwnProperty: " + (d.hasOwnProperty(key)?"true":"false <== !!PROBLEM!!")); 
     trace(" in: " + (key in d)); 
     trace(" []: " + d[key]); 
    }; 
test({}, "indexed by object"); 
test("string", "key is string"); 
test(0, "key is number"); 
test(true, "key is boolean"); 

結果:

indexed by object 
    hasOwnProperty: false <== !!PROBLEM!! 
    in: true 
    []: true 
key is string 
    hasOwnProperty: true 
    in: true 
    []: true 
key is number 
    hasOwnProperty: true 
    in: true 
    []: true 
key is boolean 
    hasOwnProperty: true 
    in: true 
    []: true 
+2

そして、まだそれによりがあります。 hasOwnPropertyは静的ルックアップをサポートしていません。たとえば、**静的プロパティ** - オブジェクトの定義クラスまたはそのスーパークラスのstaticキーワードで定義された変数、定数、またはメソッド。 '** Prototype properties **' - オブジェクトのプロトタイプチェーンの一部であるプロトタイプオブジェクトに定義されたプロパティ。 'false'を返します。 –

+0

静的またはプロトタイプのプロパティまたはメソッドが存在するかどうかをチェックしないため、 'hasOwnProperty'としてプロパティまたはメソッドにアクセスするとエラーがスローされるかどうかを' in'で調べる方法があります。 –

4

私が知っている変更は、hasOwnPropertyではなく、ほとんどのAS3開発者がプロ​​トタイプを使用しないので、プロトタイプチェーンをルックアップしているため、日常使用には関係しません。

関連する問題