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”的属性obj——就像obj.size寻找一个名为“size”的属性一样。x没有为您的对象定义,所以它什么都没有。正确的写法obj[x]——使用变量 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”的变量中时使用方括号形式 ( ),当属性名称字面意思是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".
于 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 回答