¿Para qué se usa?
Symbol se usa para crear valores únicos, irrepetibles
Un símbolo solo es igual a si mismo
1
2
3
4
5
6
7
8
9
|
let s1 = Symbol("descripcion");
let s2 = Symbol("descripcion");
console.log(s1 === s2); //false
let s3 = Symbol();
let s4 = Symbol();
console.log(s3 === s4); //false
console.log(s4 === s4); //true
|
Al menos que lo creemos de otra manera…
Existe un registro global de símbolos y para crear un símbolo que se guarde ahí:
1
2
3
4
5
|
let s5 = Symbol.for("descripcion");
console.log(s5); //Symbol(descripcion)
let s6 = Symbol.for("descripcion");
console.log(s5 === s6); //true
|
Registro global de símbolos
Aquí podremos acceder al mismo símbolo desde distintos lugares de nuestro programa a partir de su descripción.
Es compartido entre nuestra página y los serviceWorkers o iframes que esta pueda llegar a incluir
Para saber la descripción de un símbolo:
1
2
|
let desc = Symbol.keyFor(s6);
console.log(desc); //descripcion
|
Ejemplo
Son buenos remplazos para valores constantes que podrian podrían a ser strings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
const DIRECCIONES = {
IZQ: "IZQUIERDA",
DER: "DERECHA",
};
function mover(direccion) {
switch (direccion) {
case DIRECCIONES.IZQ:
console.log("Mover a la izquierda");
break;
case DIRECCIONES.DER:
console.log("Mover a la derecha");
break;
default:
console.log("Direccion desconocida");
}
}
mover(DIRECCIONES.IZQ); // Mover a la izquierda
mover("IZQUIERDA"); // Mover a la izquierda
|
Para hacer que solo se usen los del objeto y no strings sueltos nos podría servir symbol.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
const DIRECCIONES2 = {
IZQ: Symbol("IZQUIERDA"),
DER: Symbol("DERECHA"),
};
function mover2(direccion) {
switch (direccion) {
case DIRECCIONES2.IZQ:
console.log("Mover a la izquierda");
break;
case DIRECCIONES2.DER:
console.log("Mover a la derecha");
break;
default:
console.log("Direccion desconocida");
}
}
mover2(DIRECCIONES2.IZQ); // Mover a la izquierda
mover2("IZQUIERDA"); // Direccion desconocida
|
También las podemos usar como propiedades únicas de los objectos
1
2
3
4
5
6
7
|
function validarEmail(user) {
if (!user.valid) {
if (user.email.endsWith("@gmail.com")) {
user.valid = true;
}
}
}
|
Si un user ya está marcado como valido, no debe realizar la comprobación del gmail
¿Pero qué pasa si el user ya venía con un atributo valid cualquier otra cosa?
Perderíamos el valor que tenía antes.
1
2
3
4
5
6
7
8
9
|
let valiedEmail = Symbol("valid email");
function validarEmail(user) {
if (!user[valiedEmail]) {
if (user.email.endsWith("@gmail.com")) {
user[valiedEmail] = true;
}
}
}
|
No existe otro símbolo que lo pueda pisar, incluso tengan la misma descripción
Nos permiten agregar propiedades ocultas dentro de los objetos
Solamente se puede acceder a los símbolos que son propiedades de un objeto, es con Object.getOwnPropertySymbol(user)
Ejemplos obtenidos de La Cocina del Código
Indice
- Tipos de Datos Primitivos
- String
- Number
- Boolean
- Null y Undefined
- Symbol <– Estás aquí