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


80

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

foo = {`bar`: 'baz'}

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

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

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

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

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


2
并不是因为这个原因,引入了计算属性名称。是的,您需要在其周围加括号,但从语法上来说,它还是解决各种情况的通用解决方案更好。
Praveen Puglia 2015年

我只是在重新考虑我的答案,也不太确定它是正确的。现在我通过ES6文档挖....
马克斯

为什么不允许模板字符串作为文字对象键?他们是,您只是语法错误...?
Mathletics'Mar

Answers:


70

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

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

是出于性能原因吗?

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

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

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

不。

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


2
那var obj = {`$ {dyanmicKey}`:val}`呢?
b4d4r

77
@ b4d4r:否-您需要使用计算属性。要么要么var obj = {[`${dyanmicKey}`]: val}只是var obj = {[dyanmicKey]: val}
Bergi '16

伙计,为什么不呢。他们只是不希望人们在其中放置表情……
geoyws

@Bergi如何解决以下问题:profile.preferences.networks[${network.name}]
basickarl

1
@SafalPillai不在未加引号的标识符名称中,但{"#key": "value"}完全可以。
Bergi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.