--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - ECMAScript 2015 - JavaScript - Reference - Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol original_slug: Web/JavaScript/Reference/Objets_globaux/Symbol ---
Un symbole est un type de données primitif représentant une donnée unique et inchangeable qui peut être utilisée afin de représenter des identifiants pour des propriétés d'un objet. L'objet Symbol
est un conteneur objet implicite pour le {{Glossary("Primitive", "type de données primitif")}} symbole.
Symbol([description])
description
{{optional_inline}}Pour créer un nouveau symbole, il suffit d'appeler Symbol()
, éventuellement avec une chaîne de caractère descriptive :
var sym1 = Symbol(); var sym2 = Symbol("toto"); var sym3 = Symbol("toto");
Le fragment de code ci-dessus permet de créer trois nouveaux symboles. On notera que l'instruction Symbol("toto")
ne convertit pas la chaîne "toto" en un symbole. On crée bien un nouveau symbole pour chaque instruction ci-avant.
Symbol("toto") === Symbol("toto"); // false
La syntaxe suivante, utilisant l'opérateur {{jsxref("Opérateurs/L_opérateur_new", "new")}}, entraînera une exception {{jsxref("TypeError")}}:
var sym = new Symbol(); // TypeError
Cela est fait pour empêcher d'écrire un conteneur (wrapper) explicite de Symbol
plutôt qu'une nouvelle valeur, cela peut être surprenant car généralement, on peut créer des objets « autour » de types primitifs (par exemple avec new Boolean
, new String
et new Number
).
Si on souhaite obtenir un object contenant un symbole, on pourra toujours utiliser la fonction Object()
:
var sym = Symbol("toto"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
La syntaxe manipulée ci-avant, utilisant la fonction Symbol()
, ne crée pas un symbole global, disponible partout dans votre code. Pour créer des symboles qui soient disponibles pour différents fichiers et appartiennent à l'environnement global, il faut utiliser les méthodes {{jsxref("Symbol.for()")}} et {{jsxref("Symbol.keyFor()")}} afin de définir et de récupérer les symboles listés dans le registre global.
La méthode {{jsxref("Object.getOwnPropertySymbols()")}} renvoie un tableau de symboles, permettant ainsi de connaître les propriétés identifiées par un symbole pour un objet donné. À l'initialisation, un objet ne contient aucune propriété propre identifiée par un symbole, ce tableau sera donc vide jusqu'à ce qu'une propriété, identifiée par un symbole, lui soit ajoutée.
Lorsqu'on utilise des mécanismes de conversion de types avec les symboles, on aura le comportement suivant :
+sym
ou sym | 0
).true
avec Object(sym) == sym
.
Symbol("toto") + "truc"
lève une exception {{jsxref("TypeError")}} (le symbole ne peut pas être converti en une chaîne de caractères), cela permet par exemple d'éviter de créer (sans s'en rendre compte) des noms de propriétés basés sur des symboles.new String(sym)
renverra une erreur.Symbol.length
Symbol
.En plus des symboles que vous pouvez créer, JavaScript possède certains symboles natifs représentant des aspects internes du langages qui, pour ECMAScript 5 et les versions précédentes, n'étaient pas exposées aux développeurs. Il est possible d'accéder à ces symboles en utilisant les propriétés suivantes :
for await...of
.with
.Symbol
Tous les symboles héritent de {{jsxref("Symbol.prototype")}}.
{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Symbol/prototype','Propri.C3.A9t.C3.A9s')}}
{{page('fr/docs/Web/JavaScript/Reference/Objets_globaux/Symbol/prototype','M.C3.A9thodes')}}
typeof
avec des symbolesL'opérateur {{jsxref("Opérateurs/L_opérateur_typeof", "typeof")}} permet d'identifier des symboles :
typeof Symbol() === 'symbol' typeof Symbol('toto') === 'symbol' typeof Symbol.iterator === 'symbol'
for...in
Les symboles ne peuvent pas être énumérés dans les boucles for...in
. De plus, la méthode {{jsxref("Object.getOwnPropertyNames()")}} ne renverra pas les propriétés identifiées par des symboles. La méthode {{jsxref("Object.getOwnPropertySymbols()")}} permet d'avoir accès à ces propriétés.
var obj = {}; obj[Symbol("a")] = "a"; obj[Symbol.for("b")] = "b"; obj["c"] = "c"; obj.d = "d"; for (var i in obj) { console.log(i); // enregistre "c" et "d" }
JSON.stringify()
Les propriétés identifiées par des symboles seront totalement ignorées par JSON.stringify()
:
JSON.stringify({[Symbol("toto")]: "toto"}); // '{}'
Pour plus de détails, voir la page {{jsxref("JSON.stringify()")}}.
Lors qu'on on utilise un objet pour contenir la valeur du symbole et faire référence à une propriété, l'objet sera ramené au symbole d'origine :
var sym = Symbol("toto") var obj = {[sym]: 1}; obj[sym]; // 1 obj[Object(sym)]; // toujours 1
Spécification | État | Commentaires |
---|---|---|
{{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES2015')}} | Définition initiale. |
{{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Symbol")}}