El símbolo en Javascript

Conozca los símbolos: el tipo de datos único para las propiedades de los objetos

En JavaScript, los símbolos son tipos de datos únicos que se pueden usar para crear identificadores para propiedades de objetos. Los símbolos no son como cadenas o números, y no se pueden convertir a esos tipos de datos. Esto es lo que los hace ideales para crear identificadores.

Uso de símbolos en Javascript

Cuando crea un símbolo, opcionalmente puede darle una descripción. Esto es útil para la depuración, pero no es necesario.

Crear un símbolo es simple.

const mySymbol = Symbol();

También puede crear un símbolo con una descripción.

const mySymbol = Symbol("my description");

Si crea varios símbolos con la misma descripción, tendrán valores diferentes.

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

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

Lo que hace que los símbolos sean únicos

Los símbolos se utilizan a menudo como identificadores de las propiedades de los objetos. Esto se debe a que se garantiza que los símbolos son únicos y no se convierten en cadenas.

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

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

Puede usar símbolos como claves para las propiedades de los objetos, pero no puede usarlos como nombres de propiedades (claves) en JSON.

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

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

Los símbolos no son enumerables, por lo que no aparecerán cuando utilice un bucle for-in en un objeto.

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

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

Puede usar Object.getOwnPropertySymbols para obtener una matriz de todos los símbolos en un objeto.

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

const symbols = Object.getOwnPropertySymbols(obj);

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

Uso de un símbolo como iterador

Puede usar el conocido Symbol.iterator para obtener un símbolo que se puede usar como iterador.

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 ejemplo más real

Puede crear sus propios símbolos, pero no hay forma de garantizar que sean únicos. Si necesita un símbolo único, debe usar Symbol().

Suponga que tiene un objeto que representa a una persona. Desea agregar una propiedad a este objeto que almacene el año de nacimiento de la persona, pero no desea que esta propiedad sea enumerable. Puedes hacer esto con un símbolo:

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