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.
Sur cette page

Exemple

#
JavaScript
const id1 = Symbol('id')
const id2 = Symbol('id')

console.log(id1 === id2)
console.log(typeof id1)
console.log(id1.description)
console.log(id1.toString())
Console
false
symbol
id
Symbol(id)

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

#
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

#
Une clé cachée du parcours ordinaire
JavaScript
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))
Console
42
['name']
{"name":"Léa"}
[Symbol(internalId)]
Le registre global : Symbol.for()
JavaScript
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)
Console
true
app.theme
false
Un symbole intégré : Symbol.toPrimitive
JavaScript
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)
Console
120
120 pts
240

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 une TypeError. 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 une TypeError. Utilisez symbol.toString() ou symbol.description.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.