Symbol
Un type primitif pour créer des identifiants uniques, par ex. des clés de propriété qui n’entrent jamais en collision avec d’autres.
- Renvoie
- Une nouvelle valeur unique de type
symbol.
Exemple
#const id1 = Symbol('id')
const id2 = Symbol('id')
console.log(id1 === id2)
console.log(typeof id1)
console.log(id1.description)
console.log(id1.toString())Définition et utilisation
#Symbol() crée une nouvelle valeur unique de type symbol. Chaque appel donne un symbole différent, même avec la même description : Symbol("id") === Symbol("id") renvoie false. La description entre parenthèses sert seulement au débogage et reste accessible via la propriété description.
Les symboles servent le plus souvent de clés de propriété d’objets. Une telle clé n’entre jamais en collision avec une chaîne ni avec une clé ajoutée par un autre code, comme une bibliothèque. Les propriétés avec des clés symboliques sont ignorées par Object.keys(), une boucle for...in et JSON.stringify(), donc elles conviennent bien pour des données auxiliaires cachées d’une inspection ordinaire de l’objet. Elles ne sont toutefois pas vraiment privées, car Object.getOwnPropertySymbols() peut les lire.
Le langage possède aussi des symboles intégrés qui permettent de modifier le comportement de vos propres objets. Symbol.iterator permet à un objet de fonctionner avec for...of, et Symbol.toPrimitive contrôle la conversion d’un objet en nombre ou en chaîne. Symbol.for("clé") renvoie un symbole du registre global, le même pour une clé donnée dans toute l’application. Un symbole ne se crée pas avec new.
Syntaxe
#Symbol()
Symbol(description)
Symbol.for(key)
const obj = { [symbol]: value }
obj[symbol]Paramètres
#description
chaîne optionnelle
Une description visible dans la console et dans la propriétédescription. Elle n’a aucun effet sur l’unicité du symbole.
Plus d’exemples
#const internalId = Symbol('internalId')
const student = { name: 'Léa', [internalId]: 42 }
console.log(student[internalId])
console.log(Object.keys(student))
console.log(JSON.stringify(student))
console.log(Object.getOwnPropertySymbols(student))const a = Symbol.for('app.theme')
const b = Symbol.for('app.theme')
console.log(a === b)
console.log(Symbol.keyFor(a))
console.log(Symbol('app.theme') === a)class Score {
constructor(points) {
this.points = points
}
[Symbol.toPrimitive](hint) {
return hint === 'number' ? this.points : `${this.points} pts`
}
}
const score = new Score(120)
console.log(+score)
console.log(`${score}`)
console.log(score * 2)Le moteur appelle la méthode [Symbol.toPrimitive] à chaque conversion de l’objet en valeur primitive. L’argument hint indique s’il faut un nombre ("number"), une chaîne ("string"), ou peu importe ("default").
Compatibilité des navigateurs
#Largement disponible
Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.
- Chrome
- Edge
- Firefox
- Safari
Bonnes pratiques
#- Un symbole ne garantit pas une vraie confidentialité. Pour cacher des données dans des classes, utilisez des champs privés
#champ. - Ne créez pas de symbole avec
new Symbol(), car cela déclenche uneTypeError. Un symbole est une valeur primitive, comme un nombre ou une chaîne. - Un symbole ne se convertit pas tout seul en chaîne :
"id: " + Symbol("x")déclenche uneTypeError. Utilisezsymbol.toString()ousymbol.description.
Entrées associées
#- Itérateurs (Symbol.iterator)Le protocole d’itération : un objet avec une méthode [Symbol.iterator]() fonctionne avec for...of, le spread et la déstructuration.
- #champLes champs et méthodes préfixés par # sont privés : seul le code à l’intérieur de la classe peut y accéder.
- Object.keys()Renvoie un tableau des noms des propriétés propres et énumérables d’un objet.
- typeofRenvoie une chaîne avec le nom du type d’une valeur, par ex. "number", "string" ou "object".
- JSON.stringify()Transforme une valeur JavaScript, comme un objet ou un tableau, en chaîne de caractères au format JSON.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.