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

Javascript 模板字符串作为对象属性名,javascript,node.js,object-literal,template-strings,template-literals,Javascript,Node.js,Object Literal,Template Strings,Template Literals,为什么JavaScript不允许模板字符串作为对象属性键?例如,当我输入: foo = {`bar`: 'baz'} 在NodeJS REPL中,它抛出一个带有长堆栈跟踪的“意外模板字符串”的SyntaxError。但是,属性值很好,这并不意外。浏览器中也会出现类似的错误,例如,Firebug抛出一个带有“无效属性id”的SyntaxError “计算属性名称”中允许使用模板字符串。例如,这在所有支持以下语法的浏览器中都可以编译得非常好: var foo = { [`bar` + 1]

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

foo = {`bar`: 'baz'}
在NodeJS REPL中,它抛出一个带有长堆栈跟踪的“意外模板字符串”的
SyntaxError
。但是,属性值很好,这并不意外。浏览器中也会出现类似的错误,例如,Firebug抛出一个带有“无效属性id”的
SyntaxError

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

var foo = {
    [`bar` + 1]: `baz`
};
并创建对象
{“bar1”:“baz”}

为什么不允许模板字符串作为文本对象键?是出于性能原因吗?必须编译模板字符串,可能是在运行时(如果我错了,请纠正我),这意味着每次遇到此对象时,解释器都必须计算对象名。考虑到像“煮熟的”模板字符串这样的因素,这似乎会变得很慢,尽管我们从ES5开始就有了getter和setter。Firefox没有提到这是一个错误,这就是为什么我发现它出乎意料的原因。将来会允许使用这种语法吗

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

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

是出于性能原因吗

不,不太可能。这有助于简化解析,并便于区分常量(静态已知)属性名和动态计算的属性名

最重要的是,这是一个没有人需要的功能。它不会简化或缩短任何事情,并且您将通过它实现的目标已经是可能的

将来会允许使用这种语法吗

没有


1:即使它们被称为“模板文字”,但从技术上讲它们不是。而且:模板甚至不需要是字符串,它们可以计算任何值。

对象键应该是字符串

如果作为键提供的表达式不是字符串,引擎将尝试将其转换为字符串

模板字符串不是“可共享的”,hense,引擎在尝试对其进行共享时抛出错误

另一方面,数组自然可以与字符串协同使用,因此可以用作键

此外,在创建对象时,包含模板字符串的数组可以用作完全合法的键,因为引擎首先计算模板表达式,然后将数组合并为字符串,请参见此处:

{`foo`: "bar"} //Error
{[`foo`]: "bar"} // OK => {foo: "bar"}
const obj = {foo: "bar"}
const obj1 = {[obj.foo]: "bar"} // OK => {bar: "bar"} !!

这不是引入计算属性名的原因吗。是的,你需要在它周围加上括号,但从语法上看,作为解决各种情况的通用解决方案,它似乎更好。我只是在重新思考我的答案,不太确定它是否正确。现在我正在浏览ES6文档……为什么不允许模板字符串作为文本对象键?它们是,您只是语法错误…?关于'var obj={`${dyanmicKey}`:val}`?@b4d4r:No-您需要使用计算属性。要么是
var obj={[`${dyanmicKey}}]:val}
要么就是
var obj={[dyanmicKey]:val}
。伙计,为什么不呢。他们只是不想让人们把表达式放在那里,嗯…@Bergi人们如何解决以下问题:
profile.preferences.networks[${network.name}]
@SafalPillai不在一个不带引号的标识符名称中,但是
{key]:“value”}
完全可以。我从来没有想过为什么数组可以用作对象键名,但现在它有了完美的意义!