考虑: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
在您的其他示例中,同样的事情正在进行。子表达式
5
和1+4
的计算方式与在其他地方计算的方式完全相同。也就是说,请考虑:var x = 1 + 4;
您期望“x”是什么?好,那么:
var x = fighter;
显然希望“x”是字符串“fighter”会很奇怪;如果语言做到了,您将如何引用变量?