Warum lässt JavaScript eine Vorlagenzeichenfolge nicht als Objekteigenschaftsschlüssel zu? Zum Beispiel, wenn ich Folgendes eingebe:
foo = {`bar`: 'baz'}
In die NodeJS REPL wird eine SyntaxError
mit "Unerwartete Vorlagenzeichenfolge" mit einer langen Stapelverfolgung ausgelöst. Eigenschaftswerte sind jedoch in Ordnung, was nicht so unerwartet ist. Ähnliche Fehler treten im Browser auf, z. B. löst Firebug eine SyntaxError
mit "ungültiger Eigenschafts-ID" aus.
Vorlagenzeichenfolgen sind in "berechneten Eigenschaftsnamen" zulässig. Dies lässt sich beispielsweise in allen Browsern, die die Syntax unterstützen, einwandfrei kompilieren:
var foo = {
[`bar` + 1]: `baz`
};
und erstellt das Objekt {"bar1": "baz"}
.
Warum sind Vorlagenzeichenfolgen nicht als Literalobjektschlüssel zulässig? Ist es aus Leistungsgründen? Vorlagenzeichenfolgen müssen möglicherweise zur Laufzeit kompiliert werden (korrigieren Sie mich, wenn ich falsch liege). Dies bedeutet, dass der Interpreter jedes Mal, wenn er auf dieses Objekt trifft, den Objektnamen berechnen muss. Unter Berücksichtigung von Dingen wie "gekochten" Template-Strings scheint dies langsam zu werden, obwohl wir seit ES5 Getter und Setter haben. Firefox erwähnt dies nicht als Fehler, weshalb ich es unerwartet fand. Wird die Syntax irgendwann in der Zukunft erlaubt sein?
Antworten:
Vorlagenzeichenfolgen sind Ausdrücke, keine Literale 1 . Sie können Zeichenfolgenliterale (und Bezeichner) nur für Eigenschaftsnamen verwenden. Für alles andere - von dem nicht bekannt ist, dass es statisch ist - benötigen Sie einen berechneten Eigenschaftsnamen.
Nein, das ist unwahrscheinlich. Dies erleichtert das Parsen und macht es einfach, konstante (statisch bekannte) Eigenschaftsnamen von dynamisch berechneten zu unterscheiden.
Und meistens ist es eine Funktion, die niemand braucht. Es vereinfacht oder verkürzt nichts, und was Sie damit erreichen würden, ist bereits möglich.
Nee.
1: Selbst wenn sie "Vorlagenliterale" genannt werden, sind sie technisch gesehen keine Literale . Und: Vorlagen müssen nicht einmal Zeichenfolgen sein, sie können zu allem ausgewertet werden.
quelle
var obj = {[`${dyanmicKey}`]: val}
oder nurvar obj = {[dyanmicKey]: val}
.profile.preferences.networks[${network.name}]
{"#key": "value"}
völlig in Ordnung.