一尘不染

模板字符串作为对象属性名称

javascript

为什么JavaScript不允许模板字符串作为对象属性键?例如,当我输入:

foo = {`bar`: 'baz'}

到NodeJS
REPL中,它会引发SyntaxError带有长堆栈跟踪的“意外模板字符串”。属性值很好,但是,这并不出乎意料。浏览器中也会发生类似的错误,例如Firebug抛出一个SyntaxError带有“无效属性ID”的错误。

“计算的属性名称”中允许使用模板字符串。例如,这在所有支持以下语法的浏览器中都可以完美编译:

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

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

为什么不允许模板字符串作为文字对象键?
是出于性能原因吗?模板字符串必须在运行时进行编译(如果我错了,请纠正我),这意味着每次遇到此对象时,解释器都必须计算对象名称。考虑到“煮熟的”模板字符串之类的因素,这看起来可能会变慢,尽管自ES5以来我们已经有了吸气剂和吸气剂。Firefox并没有将其提及为错误,这就是为什么我发现它出乎意料。将来的某个时间会允许使用该语法吗?


阅读 825

收藏
2020-05-01

共1个答案

一尘不染

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

模板字符串是表达式,而不是文字1。您只能对属性名称使用字符串文字(和标识符),而对于其他所有内容(不是静态的),都需要计算出的属性名称。

是出于性能原因吗?

不,那不太可能。这是为了简化解析,并使其易于将常量(静态已知)属性名称与动态计算的属性名称区分开。

大多数情况下,这是一项没人需要的功能。它不会简化或缩短任何事情,并且已经可以实现。

将来的某个时间会允许使用该语法吗?

不。

1:即使将它们称为“模板文字”,从技术上讲,它们也不是文字。并且:模板甚至不需要是字符串,它们可以求值任何东西。

2020-05-01