1

次のコード:

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ステートメントからは機能するのでしょうか?

4

5 に答える 5

8

を記述するobj.xと、これは文字どおり "x" という名前のプロパティを探しますobjobj.size"size" という名前のプロパティを探すのと同じです。xオブジェクトに対して定義されていないため、何も表示されません。正しい書き方 — —変数obj[x]を使用して、オブジェクト内のプロパティを検索します。角括弧構文は角括弧内の値を使用してプロパティを検索しますが、ドット構文はプロパティ名を文字列に変換します。したがって、これら2つは同等です。 x

obj.x
obj["x"]

したがって、xafterを記述obj.すると、それは文字列に変換さxれます — これはもはや変数ではありません。

于 2012-04-19T18:03:31.163 に答える
4

ブラケット構文は、名前が式であるプロパティを受け取るために使用されます (式は、リテラル、変数、またはより複雑なものにすることができます)。

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

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

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

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

于 2012-04-19T18:05:56.013 に答える
2

obj[x]プロパティ名が「x」という名前の変数に格納されている場合はブラケット形式 ( ) を使用し、プロパティ名が文字通り「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".
于 2012-04-19T18:05:22.707 に答える
0

試す

for(var x in obj){
    console.log(obj[x]);
}
于 2012-04-19T18:05:43.270 に答える
0

これは私のために働く:

var obj = {uname:"OdO", age:"22"};  

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

http://jsfiddle.net/zA8HB/

于 2012-04-19T18:18:09.270 に答える