Cadena de plantilla como nombre de propiedad de objeto

80

¿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 SyntaxErrorcon "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?

trisis
fuente
2
¿No es esa la razón por la que se introducen los nombres de propiedades calculados? Sí, necesita refuerzos a su alrededor, pero también parece mejor sintácticamente como una solución genérica que aborda varios escenarios.
Praveen Puglia
Solo estoy reconsiderando mi respuesta y no estoy muy seguro de que sea correcta. Ahora estoy investigando los documentos de ES6 ...
Máx.
¿Por qué no se permiten cadenas de plantilla como claves de objeto literal? Lo son, ¿tienes la sintaxis incorrecta ...?
Mathletics

Respuestas:

70

¿Por qué no se permiten las cadenas de plantilla como claves de objeto literal?

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.

¿Es por motivos de rendimiento?

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.

¿Se permitirá la sintaxis en el futuro?

¡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.

Bergi
fuente
2
¿qué pasa con `var obj = {` $ {dyanmicKey} `: val}`?
b4d4r
78
@ b4d4r: No, es necesario utilizar propiedades calculadas. Cualquiera var obj = {[`${dyanmicKey}`]: val}o solo var obj = {[dyanmicKey]: val}.
Bergi
Hombre, ¿por qué no? Ellos simplemente no quieren que la gente a poner expresiones allí eh ...
geoyws
@Bergi ¿Cómo se arreglaría lo siguiente?profile.preferences.networks[${network.name}]
basickarl
1
@SafalPillai No dentro de un nombre de identificador sin comillas, pero {"#key": "value"}está totalmente bien.
Bergi