JavaScriptがテンプレート文字列をオブジェクトプロパティキーとして許可しないのはなぜですか?たとえば、私が入力すると:
foo = {`bar`: 'baz'}
nodeJS REPLに、長いスタックトレースとともに「予期しないテンプレート文字列」を含むSyntaxError
をスローします。ただし、プロパティ値は問題ありませんが、それほど予想外ではありません。ブラウザでも同様のエラーが発生します。たとえば、Firebugは「無効なプロパティID」を持つSyntaxError
をスローします。
テンプレート文字列は、「計算されたプロパティ名」で許可されます。たとえば、これは構文をサポートするすべてのブラウザで完全にコンパイルされます:
var foo = {
[`bar` + 1]: `baz`
};
オブジェクト{"bar1": "baz"}
を作成します。
テンプレート文字列がリテラルオブジェクトキーとして許可されないのはなぜですかパフォーマンス上の理由からですか?テンプレート文字列は、おそらく実行時にコンパイルする必要があります(間違っている場合は修正してください)。つまり、このオブジェクトに遭遇するたびに、インタープリターはオブジェクト名を計算する必要があります。 「調理済み」テンプレート文字列などを考慮すると、これは遅くなる可能性がありますが、ES5以来ゲッターとセッターがありました。 Firefoxはこれをエラーとして言及していないため、予期しないことに気付きました。構文は将来許可される予定ですか?
テンプレート文字列がリテラルオブジェクトキーとして許可されないのはなぜですか?
テンプレート文字列はリテラルではなく式です1。プロパティ名には、文字列リテラル(および識別子)のみを使用できます。それ以外のすべて(静的であることがわかっていない)には、計算されたプロパティ名が必要です。
パフォーマンス上の理由ですか?
いいえ、ありそうにありません。解析を容易にするためであり、定数(静的に知られている)プロパティ名を動的に計算されたものと簡単に区別できます。
そして主に、それは誰も必要としない機能です。それは何も単純化も短縮もしませんし、あなたがそれで達成することはすでに可能です。
構文は将来許可される予定ですか?
いや。
1: "テンプレートリテラル"と呼ばれる場合でも、技術的には リテラル ではありません。また、テンプレートは文字列である必要さえなく、何にでも評価できます。