JavaScript“x in obj”:obj.x未定义?

时间:2012-04-19 18:01:06

标签: javascript syntax for-in-loop

以下代码:

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语句之外?

5 个答案:

答案 0 :(得分:8)

当您编写obj.x时,这会在obj中查找名为“x”的属性 - 就像obj.size会查找名为“size”的属性一样。 x没有为您的对象定义,因此它没有任何内容。编写它的正确方法 - obj[x] - 使用变量 x在对象中查找属性。括号语法使用括号内的值来查找属性,而点语法将属性名称转换为字符串。所以这两个是等价的:

obj.x
obj["x"]

因此,当您在x之后编写obj.时,它会将x转换为字符串 - 它不再是变量。

答案 1 :(得分:4)

括号语法用于接收名称为表达式的属性(表达式可以是文字,变量或更复杂的东西):

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

点语法用于接收具有该名称的属性:

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

在for-for-loop中,变量x包含属性名称。您正在尝试访问名为"x"的属性,该属性未定义。

答案 2 :(得分:2)

当属性名称存储在名为“x”的变量中时使用括号形式(obj[x]),当属性名称​​字面obj.x) >“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".

答案 3 :(得分:0)

尝试

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

答案 4 :(得分:0)

这对我有用:

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

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

http://jsfiddle.net/zA8HB/