如果键是动态生成的,为什么我们不能使用点属性访问器查找对象值?



TLDR:不能使用点符号的变量

我主要关心为什么我们不能根据动态生成的键查找对象的值的理论(除非我做错了)。如果我静态地类型为game.team1,它查找值非常好,但是如果键是动态生成game.key,返回undefined。我知道我们可以使用方括号访问器game[key]来查找它,但为什么我们不能使用点访问器呢?到底发生了什么事?不游戏。键在循环的第一次迭代评估到游戏。Team1,然后在对象中查找键?

const game = {
team1: 'Bayern Munich',
team2: 'Borrussia Dortmund',
players: [
[
'Neuer',
'Pavard',
'Martinez',
'Alaba',
'Davies',
'Kimmich',
'Goretzka',
'Coman',
'Muller',
'Gnarby',
'Lewandowski',
],
[
'Burki',
'Schulz',
'Hummels',
'Akanji',
'Hakimi',
'Weigl',
'Witsel',
'Hazard',
'Brandt',
'Sancho',
'Gotze',
],
],
score: '4:0',
scored: ['Lewandowski', 'Gnarby', 'Lewandowski', 'Hummels'],
date: 'Nov 9th, 2037',
odds: {
team1: 1.33,
x: 3.25,
team2: 6.5,
},
};
for (const [idx, scorer] of Object.entries(game.scored)) {
console.log(`Goal #${Number(idx) + 1}: ${scorer}`);
}
for (const [key, odd] of Object.entries(game.odds)) {
console.log(game.team1); // works ->  Bayern Munich,
console.log(
`${
key === 'x' ? `Odd of draw: ${odd}` : `Odd of victory ${game.key}: ${odd}`
}`
); // doesn't work -> Undefined
}

使用点表示法(object.property)属性只能是字母数字(以及_和$),不能以数字开头,不能包含变量。这就是为什么你的game.key示例不起作用。

括号符号(object[property])属性标识符必须是字符串,可以使用空格,以数字开头的字符串和引用字符串的变量。在您的示例中,key是一个引用字符串的变量,它可以工作。

参见:属性访问器JavaScript quick - Dot Notation vs.括号Notation

最新更新