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

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

foo = {`bar`: 'baz'}

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

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

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

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

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

1个解决方案
52 votes

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

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

是出于性能原因吗?

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

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

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

不。

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

Bergi answered 2019-11-07T01:11:31Z
translate from https://stackoverflow.com:/questions/33194138/template-string-as-object-property-name