为什么这个 for 循环日志 "undefined"?
Why does this for loop log "undefined"?
所以我有这个 javascript 对象,我想遍历并打印出它的每个 属性 值。
代码如下:
var names = {
"firstName":"Billy",
"lastName":"John",
"age":30
};
for(var a in names){
console.log(names.a);
}
然后 console.logs "undefined" 3 次。
但是如果我这样做:
for(var a in names){
console.log(names[a]);
}
它打印出 Billy, John, 30。
如果我 console.log names.firstName
在循环之外,它就可以工作。考虑到在第一个循环执行期间 a
是 firstName
,它应该可以工作。
为什么会这样?谢谢。
如果您写道:
var names = {
"a":"property a",
"firstName":"Billy",
"lastName":"John",
"age":30
};
然后循环:
for(var a in names){
console.log(names.a);
}
会记录property a
三次,明白吗?
因为names
没有.a
属性。 a
指的是一个变量,其值为属性.
names[a]
和 names.a
不等价。
a
是一个引用字符串的变量。
names.a
期望在您的名称对象中有一个名为 a
的键。
names[a]
等同于 names.firstName
、name.lastName
和 names.age
.
因为使用点符号 (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
所以我有这个 javascript 对象,我想遍历并打印出它的每个 属性 值。
代码如下:
var names = {
"firstName":"Billy",
"lastName":"John",
"age":30
};
for(var a in names){
console.log(names.a);
}
然后 console.logs "undefined" 3 次。
但是如果我这样做:
for(var a in names){
console.log(names[a]);
}
它打印出 Billy, John, 30。
如果我 console.log names.firstName
在循环之外,它就可以工作。考虑到在第一个循环执行期间 a
是 firstName
,它应该可以工作。
为什么会这样?谢谢。
如果您写道:
var names = {
"a":"property a",
"firstName":"Billy",
"lastName":"John",
"age":30
};
然后循环:
for(var a in names){
console.log(names.a);
}
会记录property a
三次,明白吗?
因为names
没有.a
属性。 a
指的是一个变量,其值为属性.
names[a]
和 names.a
不等价。
a
是一个引用字符串的变量。
names.a
期望在您的名称对象中有一个名为 a
的键。
names[a]
等同于 names.firstName
、name.lastName
和 names.age
.
因为使用点符号 (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