web-dev-qa-db-fra.com

Chaîne de modèle en tant que nom de propriété d'objet

Pourquoi JavaScript n'autorise-t-il pas une chaîne de modèle en tant que clé de propriété d'objet? Par exemple, lorsque j'entre:

foo = {`bar`: 'baz'}

dans le NodeJS REPL, il jette un SyntaxError avec une "chaîne de modèle inattendue" avec une longue trace de pile. Cependant, les valeurs des propriétés sont correctes, ce qui n'est pas aussi inattendu. Des erreurs similaires se produisent dans le navigateur, par exemple, Firebug lance un SyntaxError avec "l'identifiant de propriété invalide".

Les chaînes de modèle sont autorisées dans les "noms de propriété calculés". Par exemple, cela compile parfaitement bien dans tous les navigateurs qui prennent en charge la syntaxe:

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

et crée l'objet {"bar1": "baz"}.

Pourquoi les chaînes de modèle ne sont-elles pas autorisées en tant que clés d'objets littérales? Est-ce pour des raisons de performances? Les chaînes de modèle doivent être compilées, éventuellement au moment de l'exécution (corrigez-moi si je me trompe), ce qui signifie que chaque fois qu'il rencontre cet objet, l'interpréteur devra calculer le nom de l'objet. En tenant compte de choses comme les chaînes de modèle "cuites", cela semble pouvoir ralentir, bien que nous ayons eu des getters et des setters depuis ES5. Firefox ne mentionne pas cela comme une erreur, c'est pourquoi je l'ai trouvé inattendu. La syntaxe sera-t-elle autorisée dans le futur?

53
trysis

Pourquoi les chaînes de modèle ne sont-elles pas autorisées en tant que clés d'objets littérales?

Les chaînes de modèle sont des expressions, pas des littéraux1. Vous ne pouvez utiliser que des littéraux de chaîne (et des identificateurs) pour les noms de propriété, pour tout le reste - qui n'est pas connu pour être statique - vous avez besoin d'un nom de propriété calculé.

Est-ce pour des raisons de performances?

Non, c'est peu probable. C'est pour faciliter l'analyse, et permet de distinguer facilement les noms de propriétés constants (connus statiquement) des noms calculés dynamiquement.

Et surtout, c'est une fonctionnalité dont personne n'a besoin. Cela ne simplifie ni ne raccourcit rien, et ce que vous obtiendriez avec cela est déjà possible.

La syntaxe sera-t-elle autorisée dans le futur?

Nan.

1: Même lorsqu'ils sont appelés "modèles littéraux", techniquement, ils ne le sont pas littéraux . Et: les modèles n'ont même pas besoin d'être des chaînes, ils peuvent évaluer n'importe quoi.

50
Bergi