105

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

foo = {`bar`: 'baz'}

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

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

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

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

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

4

3 に答える 3

84

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

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

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

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

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

構文は将来的に許可されますか?

いいえ。

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

于 2016-03-09T20:41:33.623 に答える