在javascript中使用括号表示法时,为什么变量名称不能转换为字符串?

Kei*_*out 2 javascript

考虑到: var foo = {"5" : "ten", fighter : "Grohl"};

这是为什么结果?

foo[5];
"ten"

foo[1 + 4];
"ten"

foo[fighter];
ReferenceError: fighter is not defined
Run Code Online (Sandbox Code Playgroud)

当然,如果我从这开始:var fighter = 'fighter';然后我Grohl按预期得到.

我的理解是,当使用括号表示法时,括号内的表达式将被计算并转换为字符串.因此,在foo[5]5中调用toString()以将其计算为字符串,该字符串必须与括号表示法一起使用.所以我的问题是:

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

编辑:为什么我希望这是事实确实如此.如果战斗机是一个变量,持有另一个字符串...说'戴夫',那么javascript将如何知道我是否意味着'戴夫'的引用,或者我是否想将战斗机转换为实际的字符串,'战斗机'.显然javascript无法读懂我的想法.感谢@DaveNewton和@pointy的照明.

Poi*_*nty 8

因为这不是语言的基本语义所要求的.当您放入fighter括号时,您会说"请评估此子表达式并将其值用作对象属性名称".子表达式fighter是对符号的引用,而不是字符串常量.

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

foo.fighter
Run Code Online (Sandbox Code Playgroud)

在你的其他例子中,同样的事情正在发生.子表达式5,并1+4以完全,他们会在别处评估以同样的方式进行评估.也就是说,考虑一下:

var x = 1 + 4;
Run Code Online (Sandbox Code Playgroud)

您对"x"的期望是什么?好的,那么:

var x = fighter;
Run Code Online (Sandbox Code Playgroud)

显然,期望"x"将是字符串 "战斗机"将是非常奇怪的; 如果语言这样做,你会如何引用变量?