Una descripción general rápida de los símbolos de JavaScript

Simbolos

Los símbolos son nuevos primitivostipo introducido en ES6. Los símbolos son identificadores completamente únicos. Al igual que sus contrapartes primitivas ( Número , Cadena , Booleano ), se pueden crear utilizando la función de fábrica Symbol()que devuelve un Símbolo.

const symbol = Symbol('description')

Cada vez que llama a la función de fábrica, se crea un símbolo nuevo y único. El parámetro opcional con valores de cadena es una cadena descriptiva que se muestra al imprimir el símbolo.

> symbol Symbol(description)

Cada símbolo devuelto por Symbol()es único, por lo que cada símbolo tiene su propia identidad:

> Symbol() === Symbol() false

Puede ver que los símbolos son primitivos si aplica el typeofoperador a uno de ellos; devolverá un nuevo resultado específico del símbolo:

> typeof symbol 'symbol'

Caso de uso: símbolos como claves de propiedades no públicas

Siempre que haya jerarquías de herencia en JavaScript, tiene dos tipos de propiedades (por ejemplo, creadas a través de clases, un enfoque puramente prototípico):

  • Los clientes del código ven las propiedades públicas
  • Las propiedades privadas se utilizan internamente dentro de las piezas que componen la jerarquía de herencia (por ejemplo, clases, objetos).

En aras de la usabilidad, las propiedades públicas suelen tener claves de cadena. Pero para las propiedades privadas con claves de cadena, los conflictos de nombres accidentales pueden convertirse en un problema. Por tanto, los símbolos son una buena elección.

Por ejemplo, en el siguiente código, los símbolos se utilizan para propiedades privadas _countery _action:

const _counter = Symbol('counter'); const _action = Symbol('action'); class Countdown { constructor(counter, action) { this[_counter] = counter; this[_action] = action; } dec() { let counter = this[_counter]; if (counter < 1) return; counter--; this[_counter] = counter; if (counter === 0) { this[_action](); } } }

Tenga en cuenta que los símbolos solo lo protegen de los conflictos de nombres, no del acceso no autorizado. Puede averiguar todas las claves de propiedad de un objeto, incluidos los símbolos, a través de lo siguiente:

const obj = { [Symbol('my_key')] : 1, enum : 2, nonEnum : 3 }; Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable. // Ignores symbol-valued property keys: > Object.getOwnPropertyNames(obj) ['enum', 'nonEnum'] // Ignores string-valued property keys: > Object.getOwnPropertySymbols(obj) [Symbol(my_key)] // Considers all kinds of keys: > Reflect.ownKeys(obj) [Symbol(my_key),'enum', 'nonEnum'] // Only considers enumerable property keys that are strings: > Object.keys(obj) ['enum']

¿Realmente necesitamos símbolos?

Utilice símbolos cuando su requisito sea uno de estos:

  • Enum: para permitirle definir constantes con nombres semánticos y valores únicos.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • Choques de nombres: cuando querías evitar colisiones con llaves en objetos
  • Privacidad: cuando no desea que las propiedades de su objeto sean enumerables
  • Protocolos: para definir cómo se puede iterar un objeto.

    Imagine, por ejemplo, una biblioteca como la draguladefinición de un protocolo Symbol.for(dragula.moves). Puede agregar un método sobre eso Symbola cualquier elemento DOM. Si un elemento DOM sigue el protocolo, entonces dragulapodría llamar al el[Symbol.for('dragula.moves')]()método definido por el usuario para afirmar si el elemento se puede mover.

  • Símbolos conocidos: además de los símbolos definidos por el usuario, JavaScript tiene algunos símbolos integrados. Estos representan comportamientos del lenguaje interno que no fueron expuestos a los desarrolladores en <ES5. Más información aquí .

Conclusión

Symbolsen JavaScript puede proporcionar unicidad de nivel de acceso a los objetos. Vale la pena que todos los desarrolladores tengan un conocimiento básico de ellos y de sus diversos casos de uso.

code = coffee + developer