2012-04-19 5 views
1

次のコード:JavaScript "x in obj":obj.xは未定義ですか?

var obj = {uname:"OdO", age:"22"}; 
alert(obj.uname); 

結果に:今

OdO 

for..in文で同じ概念を使用して:

for (x in obj) { 
    document.write(obj.x+"<br>"); 
} 

私は次のように印刷することを期待:

OdO 
22 

それは印刷します。

undefined 
undefined 

および要素にループする印刷達成するために、それはこのような配列の要素として記述する必要があります:

for (x in obj) { 
    document.write(obj[x]+"<br>"); 
} 

その後、最初の構文が動作しない理由しかし、それはfor..inステートメントから機能しますか?

+1

問題は(OBJ [x]は ''対obj.x'( 'X'は、プロパティ名として使用される識別子である) 'です'x'は*で評価され、プロパティ名として使用される*式です)、既に別の場所でカバーされています。それは* for *で* for *とは何も関係ありません。 –

答えて

8

obj.xと書くと、これはobjの "x"という名前のプロパティを探します。ちょうどobj.sizeのように "size"という名前のプロパティを探します。 xはあなたのオブジェクトに定義されていないので、何も出てこない。それを書く正しい方法 - obj[x] - 変数xを使用してオブジェクトのプロパティをルックアップします。角括弧構文では、角括弧内の値を使用してプロパティをルックアップし、ドット構文ではプロパティ名を文字列に変換します。したがって、これらの二つは等価です:

obj.x 
obj["x"] 

は、だから、xobj.た後、それを文字列に変換しxことを書くとき - それはもう変数ではありません。

+0

同じ概念で、なぜこの 'obj [x]'がキー 'x'を探すのではないのですか?..なぜ同じオブジェクト/構造が異なって扱われるのですか? –

+0

'obj [x]'(最初の反復で) 'obj ['OdO']'を探しませんか? 'obj ['uname']'でなければならないので、それも 'undefined'でもないでしょうか?私は混乱しています。< –

+0

@ Shredder:私があなたの質問を誤解しない限り、いいえ。 forループはキーを列挙し、 '0d0'は値であるため、 'obj [' uname ']'を検索します。 – Chuck

2

プロパティ名が文字通り「X」である場合、プロパティ名は「X」という名前の変数及び属性フォーム(obj.x)に格納されているときにブラケット形(obj[x])を使用。例えば

var o = {foo:1}; 
o.foo; // => 1 
var x = 'foo'; 
o[x]; // => 1, since x='foo' and has a property named "foo". 
o.x; // => undefined, since "o" has no property named "x". 
0

ブラケット構文は、名前(式はリテラル、変数、またはより複雑なものになることができます)表現であるという性質を受信するために使用される

for(var x in obj){ 
    console.log(obj[x]); 
} 
4

をお試しください:

var x = "a"; 
{a:0, b:1}[x] == 0; 

正確にその名前のプロパティを受け取るためにドット構文が使用されます。

({a:0, x:1}).x == 1; 

for-in-loopには、変数xがプロパティ名を保持します。定義されていない"x"という名前のプロパティにアクセスしようとしています。

+0

オブジェクトは配列として扱うことができますか? –

+0

どういう意味ですか? javascriptオブジェクトは連想配列と似ていますが、それは本当ですが、javascript配列と入れ替えてはいけません。目的は異なります。 – Bergi

+0

'ob'という名前のオブジェクトを持つことは、' ob'という名前の配列を宣言してはならないということですか? –

関連する問題