2016-01-06 67 views
2

我有我所假设的是一个相当简单的JavaScript问题,但它让我莫名其妙。基本上,我无法在for循环中访问嵌套对象文字的属性内部属性。我想如果有人向我解释为什么这不起作用:在for循环中访问嵌套的JavaScript文字的属性

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); 
    } 

我想这足以说明问题。当我尝试访问循环内的内部对象的属性时,为什么会变得不确定?我想我错过了一些非常简单的东西。

感谢您的阅读。

+1

先通过与文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements /for...in –

回答

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

谢谢,这很有道理。 – DoonStar

0

应该

for(var m in object) 
{ 
    window.alert(m); 
    window.alert(object[m].propertyOne); 
} 

m是它不具有属性的键名,您需要使用这个键名来从object值,然后读取值的属性propertyOne

0

某对象的属性名for..in循环迭代。查看MDN - for..in

MDN article on Objects的文件,属性名可以被定义为:

...任何有效的JavaScript字符串,或任何可以被转换成一个字符串,包括空字符串。

因为属性名称是一个字符串,所以它没有任何您在对象中定义的属性。但是,你可以使用属性名来访问这样的属性:

for(var m in object) { 
    window.alert(m); 
    window.alert(object[m].propertyOne); 
}