W3docs

Le type Symbol en JavaScript

Apprenez le type Symbol en JavaScript : créer des valeurs uniques, utiliser les symbols comme clés d'objet cachées, le registre global avec Symbol.for et Symbol.keyFor, et les symbols bien connus.

Introduction aux Symbols JavaScript

Les Symbols, introduits dans ECMAScript 2015 (ES6), sont un type de données unique et immuable utilisé principalement pour ajouter des clés de propriétés uniques aux objets. Ce guide explore les Symbols, leurs applications pratiques, et comment ils améliorent le développement JavaScript grâce à des identifiants uniques et des capacités de méta-programmation.

Comprendre les Symbols

Un Symbol est une valeur primitive unique et immuable qui peut être utilisée comme clé d'une propriété d'objet. Chaque valeur Symbol retournée par Symbol() est distincte de toutes les autres, garantissant son unicité.

Exemple : créer et utiliser des Symbols

javascript— editable

sym1 est créé sans description, tandis que sym2 et sym3 sont créés avec la même description. Malgré cette description identique, sym2 et sym3 sont des Symbols uniques.

Notez que dans cet exemple, la fonction String() est utilisée pour convertir les Symbols en format string pour un affichage sécurisé.

Les Symbols comme clés de propriétés

Utiliser des Symbols comme clés de propriétés vous permet d'ajouter des propriétés « cachées » que l'énumération ordinaire ignore. Une propriété dont la clé est un Symbol est ignorée par for...in, par Object.keys() et par JSON.stringify(). C'est ce qui rend les Symbols utiles pour stocker des métadonnées qui ne doivent pas apparaître dans la sortie sérialisée ni lors de boucles accidentelles. Pour récupérer les clés Symbol, utilisez Object.getOwnPropertySymbols() ou Reflect.ownKeys() (ce dernier retourne à la fois les clés string et Symbol). Vous pouvez toujours contrôler les attributs d'une propriété Symbol — writable, enumerable, configurable — avec Object.defineProperty(), exactement comme pour une clé string (voir Drapeaux et descripteurs de propriétés).

Pour utiliser un Symbol comme clé dans un littéral d'objet, entourez-le de crochets : [id]. Sans les crochets, le littéral créerait une clé string ordinaire nommée "id".

Exemple : les Symbols sont ignorés lors de l'énumération

javascript— editable

L'objet user stocke 123 sous une clé Symbol que vous ne pouvez lire qu'en possédant le Symbol id d'origine. Comme Object.keys, for...in et JSON.stringify l'ignorent tous, la valeur reste en dehors des charges utiles sérialisées et des boucles de propriétés génériques — mais elle n'est pas véritablement privée : quiconque utilise Object.getOwnPropertySymbols peut tout de même la découvrir.

Partager des Symbols avec Symbol.for et Symbol.keyFor

Les Symbols créés avec Symbol.for sont stockés dans le registre global de Symbols et sont accessibles partout dans votre code, garantissant des références cohérentes grâce aux méthodes Symbol.for et Symbol.keyFor.

Exemple : partager des Symbols

javascript— editable

La différence essentielle avec Symbol() : Symbol.for(key) maintient une table globale et inter-domaines indexée par string. L'appeler deux fois avec la même clé retourne le même Symbol, même depuis des fichiers ou modules différents — utile lorsque des parties indépendantes d'une application doivent s'accorder sur un Symbol sans avoir à se l'importer mutuellement. Symbol.keyFor effectue la recherche inverse, mais uniquement pour les Symbols du registre ; pour un Symbol() ordinaire, il retourne undefined.

Utilisation en situation réelle

Voici quelques exemples pratiques illustrant comment les Symbols peuvent être utilisés dans des scénarios concrets :

1. Gérer l'accès aux propriétés d'un objet

Les Symbols sont particulièrement utiles lorsque vous souhaitez contrôler l'accès à certaines propriétés d'un objet, en vous assurant qu'elles ne sont pas modifiées ou consultées accidentellement via les méthodes d'accès courantes.

Exemple : membres privés dans les classes

Lorsque vous créez des classes en JavaScript, vous pouvez souhaiter disposer de propriétés privées qui ne doivent pas être accessibles directement en dehors des méthodes de la classe. L'utilisation de Symbols permet d'obtenir une forme de confidentialité.

javascript— editable

2. Éviter les collisions de propriétés

Lorsque vous travaillez avec des mixins ou que vous étendez des objets dont vous ne contrôlez pas tous les noms de propriétés, les Symbols peuvent aider à éviter les collisions de noms de propriétés.

Exemple : mixins sécurisés

Si vous étendez un objet avec des fonctionnalités supplémentaires provenant de plusieurs sources, les Symbols permettent de s'assurer qu'il n'y a pas de collision de clés susceptible d'écraser des propriétés existantes.

javascript— editable

3. Méta-programmation

Les Symbols font partie intégrante des capacités de méta-programmation de JavaScript. Certains Symbols bien connus sont utilisés pour modifier ou personnaliser le comportement des instances d'objets. Au-delà de Symbol.iterator, d'autres comme Symbol.toStringTag (personnalise la sortie de Object.prototype.toString) et Symbol.hasInstance (personnalise le comportement de instanceof) offrent une intégration profonde dans le langage.

Exemple : itérateurs personnalisés

Vous pouvez utiliser des Symbols pour définir un comportement d'itération personnalisé sur des objets via la propriété Symbol.iterator.

javascript— editable

4. Les Symbols pour le débogage

Les Symbols peuvent également être utiles à des fins de débogage, car vous pouvez attacher des méta-informations aux objets sans affecter leur comportement opérationnel.

Exemple : ajouter des informations de débogage

javascript— editable

Ces exemples illustrent comment les Symbols peuvent être exploités dans des scénarios pratiques pour gérer les propriétés d'objets de manière plus sûre, étendre les fonctionnalités sans interférence, et faciliter des techniques de programmation avancées en JavaScript.

Les Symbols bien connus

JavaScript prédéfinit un ensemble de Symbols « bien connus » directement sur l'objet Symbol — par exemple Symbol.iterator, Symbol.toPrimitive, Symbol.toStringTag et Symbol.hasInstance. Ceux-ci ne figurent pas dans le registre global ; ce sont des points d'ancrage fixes que le langage consulte à des moments précis. Implémenter l'un d'eux sur votre objet vous permet de personnaliser le comportement intégré.

Personnaliser la conversion primitive avec Symbol.toPrimitive

Quand un objet est utilisé là où une valeur primitive est attendue — interpolation de string, arithmétique, comparaison — JavaScript appelle la méthode Symbol.toPrimitive de l'objet (si elle est présente), en lui passant un hint valant "string", "number" ou "default". Cela vous donne un seul endroit pour contrôler toutes les coercitions, au lieu de redéfinir toString et valueOf séparément. Pour l'ensemble complet des règles, voir Conversion d'objet en valeur primitive.

javascript— editable

Parce que la logique de conversion se trouve derrière une clé Symbol, elle n'entre jamais en collision avec vos propres propriétés de données et n'apparaît jamais dans JSON.stringify.

Conclusion

Les Symbols en JavaScript offrent un moyen robuste de gérer des identifiants uniques et permettent aux développeurs de gérer les propriétés des objets avec un haut degré de contrôle et de confidentialité. En utilisant les Symbols, vous pouvez vous assurer que les propriétés sont manipulées de manière appropriée, en évitant les effets de bord involontaires.

Pratique

Pratique
Quelles sont certaines caractéristiques du type Symbol en JavaScript ?
Quelles sont certaines caractéristiques du type Symbol en JavaScript ?
Was this page helpful?