为什么一个对象声称只有在我尝试访问它的一个属性时才会被定义为undefined?

用下面的代码:

req.Course.find({}).populate('students', 'username firstName lastName registered').populate('teacher', 'image mID firstName lastName').sort({title: 1}).exec(function(err, courses){ if(err) throw err; req.toJade.courses = []; if (courses){ req.toJade.courses = advs; } res.render('courses/list', req.toJade); 

});

courses是以下格式的对象数组:

 [{ _id: objectid, title: 'History', teacher: { _id: objectid, name: 'John Smith', etc... }, etc... }, etc... ] 

我在Jade中循环访问这些对象的数组,当我尝试访问任何一个教师的属性

 for c in courses: h1= c.title small= c.teacher.name 

它返回一个错误,它不能读取未定义的属性“名称”。 当我尝试访问课程对象的任何其他属性时,就会发生这种情况。

但是,使用

 for c in courses: h1= c.title small= c.teacher 

打印出整个明确定义的对象,并显示其所有属性和正确的值。

我在做什么错了,我怎样才能访问教师对象的任何属性?

Java脚本将检查特定对象的属性是否存在,只有当我们访问它。 因为它不像C#,Java那样是键入语言。 在Java脚本中,我们可以dynamic添加或删除属性。

要检查对象中是否存在属性,我们可以使用可用于javascript中所有对象的函数。

objectname.hasOwnProperty( “propertyToCheck”)

for..in迭代对象的所有属性。 在数组的情况下,这意味着它的所有值,在数组本身上设置的所有属性以及在Array.prototype设置的所有属性。 通常在处理数组时,你只对值有兴趣,所以对于..而言并不是最好的select。

迭代Array值的正确方法是使用一个简单的for/while/do while或者使用Array#forEach和其他类似的函数迭代方法:

 for (var i=0; i<courses.length; i++) { var c = courses[i]; h1 = c.title; small = c.teacher.name; } // or courses.forEach(function(c){ h1 = c.title; small = c.teacher.name; }); 

另外,如果教师属性没有设置,避免错误的简单方法是:

 small = c.teacher && c.teacher.name; 

如果c.teacher undefined ,那么small也将被undefined ,否则将等于c.teacher.name

添加一个默认值就简单了:

 small = c.teacher && c.teacher.name || 'Unknown teacher'; 

我发现了我愚蠢的错误。 我并不希望course数组中的2个对象的老师没有定义。 我想这个事情是打破了整个事情,因为我从来没有检查过老师的财产是否存在。