javascript for ... in循环请解释

时间:2013-08-28 18:28:54

标签: javascript loops for-in-loop

我在这里的第一个问题需要帮助理解JavaScript中的for循环。

当我运行以下代码时,我从alert函数中得到“undefined”:

var o = {
  a: "property 1", 
  b: "property 2", 
  c: "property 3", 
  d: "property 4"
}

for (p in o) {
  alert(o.p); 
}

但如果我要将.更改为[ ](即alert(o[p])),则警报会按预期返回属性值。

为什么我不能使用.来访问对象属性?

4 个答案:

答案 0 :(得分:3)

想象一下你有这个对象:

var o = {
  a: "property 1", 
  b: "property 2", 
  c: "property 3", 
  d: "property 4",
  p: "property 5"
}

并运行以下内容:

for (p in o) {
  console.log(o.p);
}

结果将是:

property 5
property 5
property 5
property 5
property 5

因为o.p表示您想要获取名为p的属性的值。

同样在您的示例中,您的对象中未定义属性p

如果您想通过字符串获取属性的值,则必须使用[]表示法。

答案 1 :(得分:2)

o[p]

是数组o中的第p个元素。

o.p

是数组o的属性p,它被正确报告为未定义,因为它不存在。

答案 2 :(得分:2)

o.p表示o的属性“p”。

o [“p”]表示同样的事情。

o [x]表示x的某些属性(其值由变量o定义)。

o [p]相同。

答案 3 :(得分:1)

如果你仔细看看这个循环:

var obj = {
  a: "property 1", 
  b: "property 2", 
  c: "property 3", 
  d: "property 4"
}
for (var prop in obj) {
    if (typeof(prop) == 'string') {
        console.log('This is a string!');
    }
}

你会注意到for循环给你的是属性的名称。 这就是使用obj[prop]的原因,因为该属性是一个字符串,这是访问对象属性的合法方式。

当您尝试执行obj.prop时,它会给您未定义因为property是一个表示属性名称的字符串,它不是实际属性。