为什么循环日志“未定义”?

时间:2015-09-18 23:14:59

标签: javascript javascript-objects for-in-loop

所以我有这个javascript对象,我想循环并打印出它的每个属性值。

以下是代码:

var names = {
            "firstName":"Billy",
            "lastName":"John",
            "age":30
        };

for(var a in names){
    console.log(names.a);
}

并且它控制台.logs“未定义”3次。

但如果我这样做:

for(var a in names){
    console.log(names[a]);
}

打印出30岁的比利,约翰。

如果我在循环外的console.log names.firstName工作。并且考虑到在第一个循环执行期间afirstName,它应该可以工作。

为什么会这样?感谢。

4 个答案:

答案 0 :(得分:2)

因为names没有.a属性。 a指的是一个值为属性的变量。

答案 1 :(得分:2)

names[a]names.a不等同。

a是一个引用字符串的变量。

names.a需要名称对象中名为a的密钥。

names[a]等同于names.firstNamename.lastNamenames.age

答案 2 :(得分:2)

因为您使用点表示法(names.a)来访问对象上的属性a,所以此属性是未定义的。

当您使用括号表示法names[a]时,将评估变量并且语句如下所示:names['firstName']names['lastName'],...

通常在访问属性时总会使用点符号,但在您的情况下 - 因为您需要使用变量所持有的名称访问该属性 - 您需要使用括号表示法。

您将使用括号表示法的另一种情况是,您需要访问具有无法使用点表示法编写的名称的属性。考虑一下:

var a = { "my-special property": 1 };
// Try to access it via dot notation:'
console.log(a.my-special property); // SyntaxError
// But with bracket notation:
console.log(a['my-special property']); // 1

答案 3 :(得分:1)

如果你写了:

var names = {
            "a":"property a",
            "firstName":"Billy",
            "lastName":"John",
            "age":30
        };

然后循环:

for(var a in names){
    console.log(names.a);
}

会记录property a三次,明白吗?