2
function doIt()
{
    var person={firstname:"John", lastname:"Smith", age:"25"};
    var x;
    var txt="";
    for (x in person)
    {
        txt=txt+person[x] +"<br>";
    }
    document.getElementById("showtext").innerHTML=txt;
}

我的问题是:为什么当我更换

txt=txt+person[x]+"<br>";

和:

txt=txt+person.x+"<br>";

person.x 的值返回为未定义?在循环的第一次迭代中,x 应该是“名字”。所以 person.x 应该等于 person.firstname,因此返回值 John。我很想了解为什么它会返回“未定义”。

4

6 回答 6

3

答案是:

由于x不是属性名称,并且对象没有名称/键x的属性。

人.x

未定义。

这相当于

person[ "x" ] (细微的差别在于双引号)

什么也是未定义的。

要使其与点符号一起使用,您必须编写:

 eval("person." + x); // but this is evil 
 // Tested on win7 with chrome 45+

所以表达式eval("person." + x)将在第一次运行时扩展为eval("person.firstname" ),它返回"John"
...

我不推荐什么,因为eval可能会引入安全问题。

更新 1

免责声明: 有了这个答案,我只回答了最初的问题,并试图解释问题。对于“// but this is evil”,我建议不要使用这种方法。

于 2013-02-26T15:12:15.290 回答
3

在第一种情况下,您使用“括号表示法”,其中变量的值x用于确定属性名称。

在第二种情况下,您使用“点表示法”,其中查找的属性实际上称为x.

于 2013-02-26T15:13:44.203 回答
2

当你写的时候person[x],它的意思是“查找 的值x,然后在里面找到那个元素person”。当你写person.x它的时候,它的意思是“查找x人的内在价值”。

person没有x元素,所以你没有定义。你真的只是想要person[x]

于 2013-02-26T15:13:16.263 回答
0

x 将是一个字符串。例如“人”,所以你必须使用 [] 括号

于 2013-02-26T15:13:30.423 回答
0

您不能将点表示法与变量键一起使用。它将查找未定义的属性“x”。person[x] 是正确的方法。

于 2013-02-26T15:13:35.577 回答
0

如果您使用方括号语法,Javascript 将允许您使用变量访问对象的属性。因此,只要 x 包含表示属性名称的字符串, person[x] 就会执行您尝试执行的操作。语法结构 person.x 等价于 person["x"]。

于 2013-02-26T15:16:17.633 回答