模板string作为对象属性名称

为什么JavaScript不允许模板string作为对象属性键? 例如,当我input:

foo = {`bar`: 'baz'} 

进入NodeJS REPL,它会抛出一个带有长堆栈跟踪的“Unexpected template string”的SyntaxError 。 属性值是好的,但是,这并不意外。 类似的错误发生在浏览器中,例如,Firebug抛出一个带有“无效属性ID”的SyntaxError

“计算属性名称”中允许使用模板string。 例如,这个编译在支持语法的所有浏览器中都完美无缺:

 var foo = { [`bar` + 1]: `baz` }; 

并创build对象{"bar1": "baz"}

为什么模板string不允许作为文字对象键? 这是出于性能的原因? 模板string必须编译,可能在运行时(纠正我,如果我错了),这意味着每次遇到这个对象时,解释器将不得不计算对象名称。 考虑像“煮熟的”模板string这样的东西,看起来它可能会变慢,尽pipe从ES5开始就有了getter和setter。 Firefox并没有提到这是一个错误,这就是为什么我发现它意外。 在将来的某个时候会允许语法吗?

为什么模板string不允许作为文字对象键?

模板string是expression式,而不是文字1 。 只能使用string文字(和标识符)作为属性名称,对于其他所有内容(不知道是否为静态),则需要计算属性名称。

这是出于性能的原因?

不,这不太可能。 这是为了便于parsing,并且可以很容易地从dynamic计算的名称中区分常量(静态已知)的属性名称。

大多数情况下,这是一个没有人需要的function。 它不会简化或缩短任何事情,而且您已经可以实现。

在将来的某个时候会允许语法吗?

不。

1:即使他们被称为“模板文字”,从技术上讲,他们不是文字 。 而且:模板甚至不需要是string,他们可以评估任何东西。