我已经得到了我认为是一个相当简单的JavaScript问题,但它令我感到困惑。基本上,我无法在for循环中访问嵌套对象文字的属性内部属性。如果有人向我解释为什么这不起作用,我会很高兴:
var object = {
"foo":{
propertyOne : "One",
propertyTwo : "Two"
},
"bar":{
propertyOne : "Three",
propertyTwo : "Four"
}
};
//This correctly returns "One"
window.alert(object.foo.propertyOne);
for(var m in object)
{
//this returns foo followed by bar
window.alert(m);
//This returns undefined
window.alert(m.propertyOne);
}
我认为这足以说明问题。当我尝试访问循环中内部对象的属性时,为什么会出现未定义?我想我在这里错过了一些非常简单的东西。
感谢阅读。
答案 0 :(得分:3)
这是因为for循环中的m
是一个键名(一个字符串)。您可以使用它来访问该键引用的实际值:
for(var m in object)
{
// This returns 'foo' followed by 'bar'
console.log(m);
// returns 'string'
console.log(typeof m);
// This returns the value referenced under the 'm' key
console.log(object[m]);
// Since we know the value is an object with a `propertyOne` key..
// This returns a value from the object which is referenced by the 'm' key
console.log(object[m].propertyOne);
}
答案 1 :(得分:0)
应该是
for(var m in object)
{
window.alert(m);
window.alert(object[m].propertyOne);
}
m
是它没有属性的关键名称,您需要使用此密钥名称从object
获取值,然后读取该值的属性{ {1}}。
答案 2 :(得分:0)
for..in
循环遍历对象的属性名称。请参阅MDN - for..in
从MDN article on Objects,属性名称可以定义为:
...任何有效的JavaScript字符串,或任何可以转换为字符串的内容,包括空字符串。
因为属性名称是字符串,所以它没有您在对象中定义的任何属性。但是,您可以使用属性名称以这种方式访问属性:
for(var m in object) {
window.alert(m);
window.alert(object[m].propertyOne);
}