1. ホーム
  2. javascript

[解決済み] Template String As Object プロパティ名

2022-12-27 18:33:02

質問

JavaScriptでは、オブジェクトのプロパティのキーとしてテンプレート文字列を使用できないのはなぜですか?例えば、私が入力するとき

foo = {`bar`: 'baz'}

をNodeJSのREPLに入れると SyntaxError がスローされ、長いスタックトレースとともに "予期しないテンプレート文字列" が表示されます。しかし、プロパティ値は正常であり、これは予想外ではありません。同様のエラーはブラウザでも発生し、たとえば、Firebug は SyntaxError で、"invalid property id" がスローされます。

テンプレート文字列は、"計算されたプロパティ名"で許可されています。例えば、この構文をサポートするすべてのブラウザで、これは完全にうまくコンパイルされます。

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

で、オブジェクトを作成します。 {"bar1": "baz"} .

なぜテンプレート文字列はリテラルなオブジェクトのキーとして許可されないのですか? パフォーマンス上の理由でしょうか?テンプレート文字列はコンパイルされなければならず、おそらく実行時に (間違っていたら訂正してください)、つまり、このオブジェクトに遭遇するたびに、インタープリタはオブジェクト名を計算しなければなりません。ES5以降、ゲッターとセッターはありますが、quot;cook"テンプレート文字列のようなものを考慮すると、これは遅くなる可能性があるように思われます。Firefoxはこのことをエラーとして言及しないので、私は予想外だと思いました。この構文は将来的に許可されるようになるのでしょうか?

どのように解決するのですか?

テンプレート文字列は、なぜリテラル・オブジェクト・キーとして許可されないのですか?

テンプレート文字列は式であり、リテラルではありません 1 . 文字列リテラル(および識別子)はプロパティ名にのみ使用でき、それ以外のもの - 静的であることが知られていないもの - には、計算されたプロパティ名が必要です。

それはパフォーマンス上の理由ですか?

いいえ、それはありえません。パースしやすくするためで、定数(静的に知られている)プロパティ名と動的に計算されたプロパティ名を区別しやすくするためです。

そして、ほとんどの場合、それは誰も必要としない機能です。何も単純化も短縮もしませんし、それで達成できることはすでに可能です。

この構文は将来的に許可されるようになるのでしょうか?

いいえ。

1: テンプレート・リテラルと呼ばれているものでも、厳密には リテラル . そして、テンプレートは文字列である必要さえなく、何にでも評価することができます。