web-dev-qa-db-ja.com

オブジェクトプロパティ名としてのテンプレート文字列

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

foo = {`bar`: 'baz'}

nodeJS REPLに、長いスタックトレースとともに「予期しないテンプレート文字列」を含むSyntaxErrorをスローします。ただし、プロパティ値は問題ありませんが、それほど予想外ではありません。ブラウザでも同様のエラーが発生します。たとえば、Firebugは「無効なプロパティID」を持つSyntaxErrorをスローします。

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

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

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

テンプレート文字列がリテラルオブジェクトキーとして許可されないのはなぜですかパフォーマンス上の理由からですか?テンプレート文字列は、おそらく実行時にコンパイルする必要があります(間違っている場合は修正してください)。つまり、このオブジェクトに遭遇するたびに、インタープリターはオブジェクト名を計算する必要があります。 「調理済み」テンプレート文字列などを考慮すると、これは遅くなる可能性がありますが、ES5以来ゲッターとセッターがありました。 Firefoxはこれをエラーとして言及していないため、予期しないことに気付きました。構文は将来許可される予定ですか?

53
trysis

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

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

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

いいえ、ありそうにありません。解析を容易にするためであり、定数(静的に知られている)プロパティ名を動的に計算されたものと簡単に区別できます。

そして主に、それは誰も必要としない機能です。それは何も単純化も短縮もしませんし、あなたがそれで達成することはすでに可能です。

構文は将来許可される予定ですか?

いや。

1: "テンプレートリテラル"と呼ばれる場合でも、技術的には リテラル ではありません。また、テンプレートは文字列である必要さえなく、何にでも評価できます。

50
Bergi