Les symboles et l’objet Symbol en JavaScript

Les symboles correspondent à un nouveau type primitif de données introduit récemment en JavaScript.

Nous allons voir dans cette leçon ce qu’ils représentent et comment les utiliser.

 

Présentation des symboles en JavaScript

Un symbole est un identifiant unique qui va pouvoir servir d’identifiant pour une propriété d’un objet par exemple. L’idée principale derrière l’introduction des symboles est d’éviter les problèmes de collision entre différentes entités qui pourraient porter les mêmes noms.

En ce sens, vous pouvez considérer les symboles comme des chaines de caractères uniques : on ne peut pas avoir deux symboles de même nom dans un script.

Les symboles fournissent un moyen plus robuste de représenter des identifiants.

 

Définir des symboles

On va pouvoir créer un nouveau symbole en appelant le constructeur Symbol().

On va également pouvoir passer en argument de Symbol() une description du symbole créé qui peut être utile pour du débogage.

Création de symboles en JavaScript

Encore une fois, chaque symbole créé avec Symbol() est unique et immutable et c’est l’intérêt principal des symboles. Cela évite les problèmes de collision puisqu’on ne peut pas avoir deux symboles identiques.

 

Créer un symbole global

L’utilisation de Symbol() ne permet de créer que des symboles disponibles localement et qui ne vont pas être disponibles dans d’autres fichiers.

Pour créer un symbole global, c’est-à-dire un symbole appartenant à l’environnement global et disponible dans différents fichiers, nous utiliserons la méthode for() de Symbol.

Cette méthode prend la clef du symbole en argument et cherche le symbole associé à cette clef dans l’environnement global. Si le symbole est trouvé, il est renvoyé. Dans le cas contraire, un symbole associé à la clef passée est créé puis renvoyé.

See the Pen
Cours JavaScript 13.1.1
by Pierre (@pierregiraud)
on CodePen.

Si on souhaite récupérer la clef d’un symbole global existant, on utilisera plutôt la méthode keyFor() de Symbol. Cette méthode prend le symbole dont on souhaite connaitre la clef en argument et renvoie une chaîne de caractères qui représente la clé d’un symbole donné si celui-ci est trouvé dans le registre global ou undefined dans le cas contraire.

See the Pen
Cours JavaScript 13.1.2
by Pierre (@pierregiraud)
on CodePen.

 

Les well-known symbols

Il existe des symboles prédéfinis en JavaScript dont le JavaScript se sert en interne et qu’on va pouvoir utiliser pour personnaliser le comportement de nos objets.

Ces symboles sont également appelés les « well-known symbols ». Les plus utiles sont les suivants :

  • Symbol.hasInstance ;
  • Symbol.iterator ;
  • Symbol.toPrimitive ;
  • Symbol.isConcatSpreadable.

La propriété iterator, par exemple, retourne l’itérateur d’un objet. La propriété toPrimitive permet d’expliciter la façon dont un objet peut être transformé en valeur primitive etc.

Comme ces propriétés sont des symboles, on est certain qu’elles ne pourront être écrasées et elles sont protégées de toute modification.

 

Cas concrets d’utilisation des symboles

L’utilisation la plus courante qu’on va faire des symboles va être de les utiliser comme clés d’un objet ou d’une classe.

See the Pen
Cours JavaScript 13.1.3
by Pierre (@pierregiraud)
on CodePen.

L’unicité des symboles permet de nous assurer qu’il n’y aura pas de problème de collision entre les clés d’un objet et on peut ainsi par exemple laisser des utilisateurs étendre des objets sans prendre le risque d’avoir des propriétés écrasées par erreur.

 

En résumé

Pour le moment, les usages et utilisations des symboles en JavaScript sont, comme beaucoup d’éléments nouveaux, relativement limités.

Cependant, on peut parier que leur utilisation va se généraliser puisque le groupe en charge du développement du JavaScript les ajoutés en tant que nouvelle valeur primitive, ce qui constitue une preuve sérieuse de l’espoir placés en eux.

Aujourd’hui, les symboles sont principalement utilisés en tant que clefs d’objets, afin d’éviter les collisions notamment avec des bibliothèques externes ainsi que pour limiter le nombre de mauvaises manipulations qui peuvent se produire.

Laisser un commentaire