考虑:var foo = {"5" : "ten", fighter : "Grohl"};
为什么会这样呢?

foo[5];
"ten"

foo[1 + 4];
"ten"

foo[fighter];
ReferenceError: fighter is not defined

当然,如果我以var fighter = 'fighter';开头,那么我会按预期获得Grohl

我的理解是,当使用方括号表示法时,将对方括号内的表达式求值并将其转换为字符串。因此,在foo[5]中,在5上调用toString()以便将其评估为字符串,该字符串必须与方括号符号一起使用。所以我的问题是:

为什么fighter不提供相同的奢侈品?我知道foo ['fighter']有用,但不一定要了解。我想了解这里发生了什么。

编辑:为什么我希望情况确实如此。如果fighter是一个包含另一个字符串的变量...说'Dave',那么javascript将如何知道我是指对'Dave'的引用还是我想将fighter转换为实际的字符串'fighter'。显然,javascript无法读懂我的想法。感谢@DaveNewton和@pointy的照明。

最佳答案

因为那不是语言的基本语义所规定的。将fighter放在方括号中时,是说“请评估此子表达式并将其值用作对象属性名称”。子表达式fighter是对符号的引用,而不是字符串常量。

如果要将标识符的名称用作文字属性名称,请使用.运算符:

foo.fighter

在您的其他示例中,同样的事情正在进行。子表达式51+4的计算方式与在其他地方计算的方式完全相同。也就是说,请考虑:
var x = 1 + 4;

您期望“x”是什么?好,那么:
var x = fighter;

显然希望“x”是字符串“fighter”会很奇怪;如果语言做到了,您将如何引用变量?

10-07 12:55