¿Por qué JavaScript no permite una cadena de plantilla como clave de propiedad del objeto? Por ejemplo, cuando ingreso:
foo = {`bar`: 'baz'}
en el REPL de NodeJS, lanza un SyntaxError
con "Cadena de plantilla inesperada" con un seguimiento de pila largo. Sin embargo, los valores de propiedad están bien, lo que no es tan inesperado. Se producen errores similares en el navegador, por ejemplo, Firebug lanza un SyntaxError
"ID de propiedad no válido".
Se permiten cadenas de plantilla en "nombres de propiedad calculados". Por ejemplo, esto se compila perfectamente bien en todos los navegadores que admiten la sintaxis:
var foo = {
[`bar` + 1]: `baz`
};
y crea el objeto {"bar1": "baz"}
.
¿Por qué no se permiten cadenas de plantilla como claves de objeto literal? ¿Es por motivos de rendimiento? Las cadenas de plantillas deben compilarse, posiblemente en tiempo de ejecución (corríjame si me equivoco), lo que significa que cada vez que encuentra este objeto, el intérprete tendrá que calcular el nombre del objeto. Teniendo en cuenta cosas como cadenas de plantillas "cocidas", parece que esto podría volverse lento, aunque hemos tenido getters y setters desde ES5. Firefox no menciona esto como un error, por lo que lo encontré inesperado. ¿Se permitirá la sintaxis en el futuro?
Respuestas:
Las cadenas de plantilla son expresiones, no literales 1 . Solo puede usar literales de cadena (e identificadores) para nombres de propiedad, para todo lo demás, que no se sabe que sea estático, necesita un nombre de propiedad calculado.
No, eso es poco probable. Es para facilitar el análisis y hace que sea fácil distinguir los nombres de propiedad constantes (conocidos estáticamente) de los calculados dinámicamente.
Y sobre todo, es una característica que nadie necesita. No simplifica ni acorta nada, y lo que lograrías con él ya es posible.
¡No!
1: Incluso cuando se denominan "literales de plantilla", técnicamente no son literales . Y: las plantillas ni siquiera necesitan ser cadenas, pueden evaluar cualquier cosa.
fuente
var obj = {[`${dyanmicKey}`]: val}
o solovar obj = {[dyanmicKey]: val}
.profile.preferences.networks[${network.name}]
{"#key": "value"}
está totalmente bien.