为什么JavaScript不允许模板字符串作为对象属性键?例如,当我输入:
#!/usr/bin/env bash
echo -n "enter the first number:"; read x
echo -n "enter the second number:"; read y
if [[ "$x" -lt "$y" ]]; then
echo "$x < $y"
elif [[ "$x" -gt "$y" ]]; then
echo "$y < $x"
else
echo "$x == $y"
fi
进入NodeJS REPL,它会抛出foo = {`bar`: 'baz'}
&#34;意外的模板字符串&#34;具有长堆栈跟踪。但是,属性值很好,这并不是意料之外的。在浏览器中发生类似的错误,例如,Firebug会使用&#34;无效的属性ID&#34;抛出SyntaxError
。
&#34;计算属性名称&#34;中允许使用模板字符串。例如,这在所有支持语法的浏览器中编译完全正确:
SyntaxError
并创建对象var foo = {
[`bar` + 1]: `baz`
};
。
为什么不允许模板字符串作为文字对象键?是否出于性能原因?必须在运行时编译模板字符串(如果我错了,请纠正我),这意味着每次遇到此对象时,解释器都必须计算对象名称。考虑像&#34;煮熟的&#34;模板字符串,这似乎可能会变慢,虽然我们有自ES5以来的getter和setter。 Firefox没有提到这是一个错误,这就是我发现它意外的原因。将来某个时候会允许语法吗?
答案 0 :(得分:50)
为什么不允许模板字符串作为文字对象键?
模板字符串是表达式,而不是文字 1 。您只能对字符串文字(和标识符)使用属性名称,对于其他所有内容 - 不知道是静态的 - 您需要计算属性名称。
是出于性能原因吗?
不,那不太可能。它可以简化解析,并且可以轻松区分常量(静态已知)属性名称和动态计算属性名称。
而且大多数情况下,这是一个无人需要的功能。它不会简化或缩短任何东西,你可以用它实现的目标已经成为可能。
将来某个时候会允许语法吗?
不。
1:即使他们被称为&#34;模板文字&#34;,从技术上讲,他们也不是literals。并且:模板甚至不需要是字符串,它们可以评估任何内容。
答案 1 :(得分:2)
对象键应该是字符串。
如果作为键提供的表达式不是字符串,引擎将尝试将其转换为字符串。
模板字符串不是“可转换的”,因此,引擎在尝试转换它们时会抛出错误...
另一方面,数组自然可以转换为字符串,因此可以用作键。
此外,在创建对象时,包含模板字符串的数组可以用作完全合法的键,因为引擎首先评估模板表达式,然后将数组转换为字符串,参见此处:
{`foo`: "bar"} //Error
{[`foo`]: "bar"} // OK => {foo: "bar"}
const obj = {foo: "bar"}
const obj1 = {[obj.foo]: "bar"} // OK => {bar: "bar"} !!