Javascript 点符号与括号符号

Javascript Dot Notation vs Bracket Notation

我想弄清楚为什么当我使用 dot notation 时控制台打印 undefined 以及为什么当我使用 bracket notation 时它打印每个键的值。

我想要打印每个键的值,所以我使用括号表示法。我只想知道为什么点符号不起作用。

下面是例子。

const sunny = { mac: 'priest', dennis: 'calculating', charlie: 'birdlaw', dee: 'bird', frank: 'warthog' };

for(var key in sunny){
  console.log(sunny.key)
}

for(var key in sunny){
  console.log(sunny[key])
}

undefined
undefined
undefined
undefined
undefined
"priest"
"calculating"
"birdlaw"
"bird"
"warthog"

正如极客先生在评论中所说,sunny.key这里本质上是在寻找一个名为sunny的属性。键,未定义 如果事情可以这样工作,那么这样的代码也可以工作 ex

Var something = { "Foo" : 123 };
Var key = "Foo";
Console.log(something.key)

我想这个例子很容易理解。以及为什么这不起作用或不应该起作用

当您写入 sunny.key 时,您正在访问实例 sunny 上名为 key 的 property/field;注意,这与名为 key 的变量完全无关。 sunny.key 在您的示例中等同于 sunny["key"] 而不是 sunny[key]。当您编写 sunny[key] 时,您是在告诉解释器在 运行 时获取变量 key 的值,然后访问名称等于 的成员当时 key 的值

sunny.key中的key是一个标识符,你循环的迭代器变量是一个变量 .这是两个不同的实体,语言规则决定了您在每种情况下实际指的是哪一个。

应用于变量的运算符.是一个成员访问器,后面的任何内容都将始终是一个标识符.

循环中的键是一个属性,它保存着对象的每个键。

所以当你尝试 sunny.key 它实际上是在寻找 属性 名字 key.

当你说 sunny[key] 键是用循环中对象 运行 的 属性 提取的。所以这个符号有效。

换句话说,sunny.key等于sunny["key"]

for(var key in sunny){
  console.log(sunny.key)
}
括号中的

sunny.key相当于sunny["key"]。它正在搜索一个 属性 名称 "key",它在您的 object.Hence 中不存在,总是返回未定义。

这里的key其实是变量,不是一个字符串来提取一个属性.

的值

参见:https://codeburst.io/javascript-quickie-dot-notation-vs-bracket-notation-333641c0f781