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

时间:2015-10-18 03:56:15

标签: javascript node.js object-literal template-strings template-literals

为什么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没有提到这是一个错误,这就是我发现它意外的原因。将来某个时候会允许语法吗?

2 个答案:

答案 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"} !!