为什么这个for循环记录“未定义”?
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);
}
和它控制台。记录"undefined" 3次
但是如果我这样做:
for(var a in names){
console.log(names[a]);
}
打印出Billy, John, 30。
如果我console.log names.firstName
在循环外工作。并且考虑到在第一次循环执行时a
是firstName
,它应该工作。
为什么会发生这种情况?谢谢。
由于使用点符号(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
因为names
没有.a
属性。
a
指的是一个值为属性的变量。 names[a]
和names.a
不相等。
a
是一个引用字符串的变量。
names.a
期望在您的names对象中有一个名为a
的键。
names[a]
等于names.firstName
、name.lastName
和names.age
。
如果你写:
var names = {
"a":"property a",
"firstName":"Billy",
"lastName":"John",
"age":30
};
然后循环:
for(var a in names){
console.log(names.a);
}
将记录property a
三次,明白吗?
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 有许多关系创建记录 - 为什么未定义
- 为什么当我将变量记录到控制台时,我得到了输出,但是当我返回它时,我收到“未定义”
- 节点mssql插入返回未定义的记录集
- ExtJS-组合框中记录的未定义索引
- 控制台说JavaScript数组是未定义的,但我'我可以记录它的内容
- 代码日志记录在$.get请求中运行时未定义,但在页面上运行时工作正常
- 在setupController中,EmberJS$.ajax记录获取返回未定义的模型
- EXT.NET:“;未捕获的类型错误:无法读取属性'数据'未定义的“;将记录添加到存储时
- 记录到控制台的JavaScript字段总是“未定义”
- 为什么这个for循环记录“未定义”?
- 为什么一些节点属性在我记录它们时显示为未定义?
- 当作为参数传递给setTimeout回调函数时,全局变量被记录为未定义
- Javascript对象在记录集中未定义
- 为什么未定义此函数日志记录(JavaScript关闭)
- 未捕获的ReferenceError:在剑道网格中创建新记录时未定义CustomerContract
- 将属性添加到对象,定义它并立即记录它返回未定义
- ExtJS4 Model.save()错误:记录未定义
- 在Backbone.js集合中记录更改,我的集合未定义
- 在中间件之间正确传递数据会记录,但返回未定义的内部对象