2012-02-08 62 views
2

也许有人扣篮,但我不知道为什么这段代码的行为方式是这样:它提醒“未定义”的JavaScript ...在迭代神秘

testObjects = [ { "HI" : "how are you" } ]; 
for (obj in testObjects) { alert(obj.HI); } 

(不是“你怎么样您”)。有人会介意解释吗?

谢谢。

+2

萤火虫没有给出任何提示? – Ben 2012-02-08 04:23:59

回答

9

for ... in遍历,不元素。所以for(obj in testObjects)意味着obj是关键,在这种情况下是0(因为它是一个数组)。

你可以做

for (key in testObjects) { 
    alert(testObjects[key].HI) 
} 

然而,这是不是一个好的做法。如果你这样做,有人增加一个方法到testOjbects或所有数组,它也会迭代该方法。

+1

非常感谢这个警告,它今天让我从痛苦中解脱出来 – 2012-05-14 09:33:40

+0

嘿,很高兴听到我对某人有帮助:)。 – 2012-05-14 10:04:14

0

您的testObjects变量实际上是一个数组,而不是一个对象。因此,它显然没有“HI”键下的任何东西(另外,您不应该在JavaScript中使用for…in循环作为数组;而是使用常规forwhile循环代替)。

要么将​​您的循环代码更改为:for (obj in testObjects[0]),要么将变量定义更改为此testObjects = { "HI" : "how are you" }

如果你的程序确实希望对象的数组,你需要设置两个嵌套循环,大概是这个样子:

for (var i=0, l=testObjects.length; i<l; i++) { 
    for (var key in testObjects[i]) { 
     // console.log(key + ' is ' + testObjects[i][key]) 
    } 
}