Le symbole en Javascript

Apprenez à connaître les symboles : le type de données unique pour les propriétés d'objet

En JavaScript, les symboles sont des types de données uniques qui peuvent être utilisés pour créer des identifiants pour les propriétés d'objet. Les symboles ne sont pas comme des chaînes ou des nombres, et ils ne peuvent pas être convertis en ces types de données. C'est ce qui les rend idéales pour créer des identifiants.

Utilisation des symboles en Javascript

Lorsque vous créez un symbole, vous pouvez éventuellement lui donner une description. Ceci est utile pour le débogage, mais ce n'est pas obligatoire.

Créer un symbole est simple.

const mySymbol = Symbol();

Vous pouvez également créer un symbole avec une description.

const mySymbol = Symbol("my description");

Si vous créez plusieurs symboles avec la même description, ils auront des valeurs différentes.

const sym1 = Symbol("foo");
const sym2 = Symbol("foo");

// false
console.log(sym1 === sym2);

Ce qui rend les symboles uniques

Les symboles sont souvent utilisés comme identificateurs pour les propriétés d'objet. En effet, les symboles sont garantis uniques et ne sont pas convertis en chaînes.

const obj = {};
obj[mySymbol] = "bar";

// "bar"
console.log(obj[mySymbol]);

Vous pouvez utiliser des symboles comme clés pour les propriétés d'objet, mais vous ne pouvez pas les utiliser comme noms de propriété (clés) dans JSON.

const sym = Symbol("foo");
const obj = { [sym]: "bar" };

// {}
console.log(JSON.stringify(obj));

Les symboles ne sont pas énumérables, ils ne s'afficheront donc pas lorsque vous utilisez une boucle for-in sur un objet.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

for (var key in obj) {
  // undefined
  console.log(key);
}

Vous pouvez utiliser Object.getOwnPropertySymbols pour obtenir un tableau de tous les symboles sur un objet.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

const symbols = Object.getOwnPropertySymbols(obj);

// [Symbol(a), Symbol(b)]
console.log(symbols);

Utiliser un symbole comme itérateur

Vous pouvez utiliser le célèbre Symbol.iterator pour obtenir un symbole pouvant être utilisé comme itérateur.

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

// { value: 1, done: false }
console.log(it.next());

// { value: 2, done: false }
console.log(it.next());

// { value: 3, done: false }
console.log(it.next()); 

// { value: undefined, done: true }
console.log(it.next());

Un exemple plus concret

Vous pouvez créer vos propres symboles, mais il n'y a aucun moyen de garantir qu'ils sont uniques. Si vous avez besoin d'un symbole unique, vous devez utiliser Symbol().

Supposons que vous ayez un objet qui représente une personne. Vous voulez ajouter une propriété à cet objet qui stocke l'année de naissance de la personne, mais vous ne voulez pas que cette propriété soit énumérable. Vous pouvez le faire avec un symbole :

const person = {
  name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";

for (var key in person) {
  // name
  console.log(key); 
}

// 1955
console.log(person[birthYear]);