Il simbolo in Javascript

Scopri i simboli: il tipo di dati unico per le proprietà degli oggetti

In JavaScript, i simboli sono tipi di dati univoci che possono essere utilizzati per creare identificatori per le proprietà degli oggetti. I simboli non sono come stringhe o numeri e non possono essere convertiti in quei tipi di dati. Questo è ciò che li rende ideali per la creazione di identificatori.

Utilizzo dei simboli in Javascript

Quando crei un simbolo, puoi opzionalmente dargli una descrizione. Questo è utile per il debug, ma non è necessario.

Creare un simbolo è semplice.

const mySymbol = Symbol();

Puoi anche creare un simbolo con una descrizione.

const mySymbol = Symbol("my description");

Se crei più simboli con la stessa descrizione, avranno valori diversi.

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

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

Ciò che rende unici i simboli

I simboli sono spesso usati come identificatori per le proprietà degli oggetti. Questo perché i simboli sono garantiti per essere univoci e non vengono convertiti in stringhe.

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

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

È possibile utilizzare i simboli come chiavi per le proprietà degli oggetti, ma non come nomi di proprietà (chiavi) in JSON.

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

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

I simboli non sono enumerabili, quindi non verranno visualizzati quando si utilizza un ciclo for-in su un oggetto.

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

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

È possibile utilizzare Object.getOwnPropertySymbols per ottenere una matrice di tutti i simboli su un oggetto.

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

const symbols = Object.getOwnPropertySymbols(obj);

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

Utilizzo di un simbolo come iteratore

È possibile utilizzare il noto Symbol.iterator per ottenere un simbolo che può essere utilizzato come iteratore.

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 esempio più reale

Puoi creare i tuoi simboli, ma non c'è modo di garantire che siano unici. Se hai bisogno di un simbolo univoco, dovresti usare Symbol().

Supponiamo di avere un oggetto che rappresenta una persona. Si desidera aggiungere una proprietà a questo oggetto che memorizza l'anno di nascita della persona, ma non si desidera che questa proprietà sia enumerabile. Puoi farlo con un simbolo:

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]);