JavaScript的for...in循环,请解释。

4

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

当我运行以下代码时,从 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])),警报将按预期返回属性值。

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


3
因为程序无法知道您想要使用变量 p 而不是名为 p 的属性。因此,. 运算符特别用于属性标识符的名称 *(无论其是否存在)*,而 [] 则用于将任何表达式的结果用作属性名称。 - user2437417
4个回答

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

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


2
o[p]

判断数组 o 中是否存在第 p 个元素。

o.p

属性p是数组o的一个属性,但由于其不存在,因此被正确地报告为未定义。


2

o.p是指对象o的属性“p”。

o["p"]与此相同。

o[x]是指对象o的某个属性(其值由变量x定义)。

o[p]也是如此。


1
如果你仔细看这个 for in 循环,你会发现:
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 in循环给出的是属性名。这就是为什么使用obj[prop]是可以的,因为属性是一个字符串,这是访问对象属性的合法方式。
当你尝试执行obj.prop时,它会给你undefined,因为属性是表示属性名称的字符串,而不是实际的属性。

1
太棒了,我现在明白了,prop是一个字符串,因此就像说obj."prop"一样是不合法的。obj["prop"]是合法的。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接