W3docs

Tipo Symbol en JavaScript

Aprende el tipo Symbol de JavaScript: valores únicos, claves ocultas en objetos, el registro global con Symbol.for y Symbol.keyFor, y símbolos conocidos como Symbol.iterator y Symbol.toPrimitive.

Introducción a los Symbols de JavaScript

Los Symbols, introducidos en ECMAScript 2015 (ES6), son un tipo de dato único e inmutable que se utiliza principalmente para añadir claves de propiedad únicas a los objetos. Esta guía explora los Symbols, sus aplicaciones prácticas y cómo mejoran el desarrollo en JavaScript mediante identificadores únicos y capacidades de metaprogramación.

Entendiendo los Symbols

Un Symbol es un valor primitivo único e inmutable que puede utilizarse como clave de propiedad de un objeto. Cada valor Symbol devuelto por Symbol() es distinto de todos los demás, lo que garantiza su unicidad.

Ejemplo: Creación y uso de Symbols

javascript— editable

sym1 se crea sin descripción, mientras que sym2 y sym3 se crean con la misma descripción. A pesar de tener la misma descripción, sym2 y sym3 son Symbols únicos.

Ten en cuenta que en este ejemplo se utiliza la función String() para convertir los Symbols a formato string para un registro seguro.

Symbols como claves de propiedad

Usar Symbols como claves de propiedad permite añadir propiedades "ocultas" que la enumeración ordinaria ignora. Una propiedad con clave symbol es omitida por for...in, por Object.keys() y por JSON.stringify(). Esto es lo que hace útiles a los Symbols para almacenar metadatos que no deben filtrarse en la salida serializada ni en bucles accidentales. Para recuperar las claves symbol se utiliza Object.getOwnPropertySymbols() o Reflect.ownKeys() (este último devuelve tanto claves string como symbol). Aún puedes controlar los atributos propios de una propiedad symbol — writable, enumerable, configurable — con Object.defineProperty(), exactamente igual que con una clave string (ver Descriptores y flags de propiedad).

Para usar un symbol como clave en un literal de objeto, envuélvelo entre corchetes: [id]. Sin los corchetes, el literal crearía una clave string normal llamada "id".

Ejemplo: Los Symbols son omitidos por la enumeración

javascript— editable

El objeto user almacena 123 bajo una clave symbol que solo puedes leer si posees el symbol id original. Como Object.keys, for...in y JSON.stringify lo ignoran, el valor se mantiene fuera de los payloads serializados y de los bucles de propiedades genéricos — pero no es verdaderamente privado: cualquiera con Object.getOwnPropertySymbols puede seguir descubriéndolo.

Compartir Symbols con Symbol.for y Symbol.keyFor

Los Symbols creados con Symbol.for se almacenan en el registro global de Symbols y se puede acceder a ellos desde cualquier parte del código, lo que garantiza referencias consistentes mediante los métodos Symbol.for y Symbol.keyFor.

Ejemplo: Compartir Symbols

javascript— editable

La diferencia clave respecto a Symbol(): Symbol.for(key) mantiene una tabla global entre contextos de ejecución indexada por string. Llamarlo dos veces con la misma clave devuelve el mismo symbol, incluso desde distintos archivos o módulos — útil cuando partes independientes de una aplicación necesitan compartir un symbol sin importarlo entre sí. Symbol.keyFor realiza la búsqueda inversa, pero solo para Symbols del registro; para un Symbol() normal devuelve undefined.

Uso en el mundo real

Aquí hay algunos ejemplos prácticos de cómo se pueden usar los Symbols en escenarios del mundo real:

1. Gestionar el acceso a propiedades de objetos

Los Symbols son especialmente útiles cuando quieres controlar el acceso a ciertas propiedades de un objeto, asegurando que no sean alteradas ni accedidas accidentalmente mediante los métodos comunes de acceso a propiedades.

Ejemplo: Miembros privados en clases

Al crear clases en JavaScript, puede que quieras tener propiedades privadas que no deberían accederse directamente fuera de los métodos de la clase. Usar Symbols puede ofrecer una forma de lograr cierto grado de privacidad.

javascript— editable

2. Evitar colisiones de propiedades

Al trabajar con mixins o al extender objetos donde no controlas todos los nombres de propiedad, los Symbols pueden ayudar a evitar colisiones de nombres de propiedad.

Ejemplo: Mixins seguros

Si estás extendiendo un objeto con funcionalidad adicional proveniente de múltiples fuentes, los Symbols pueden garantizar que no haya colisiones de claves que puedan sobrescribir propiedades existentes.

javascript— editable

3. Metaprogramación

Los Symbols son fundamentales para las capacidades de metaprogramación de JavaScript. Ciertos Symbols conocidos se utilizan para modificar o personalizar el comportamiento de las instancias de objeto. Más allá de Symbol.iterator, otros como Symbol.toStringTag (personaliza la salida de Object.prototype.toString) y Symbol.hasInstance (personaliza el comportamiento de instanceof) proporcionan una profunda integración con el lenguaje.

Ejemplo: Iteradores personalizados

Puedes usar Symbols para definir un comportamiento de iteración personalizado en objetos mediante la propiedad Symbol.iterator.

javascript— editable

4. Symbols para depuración

Los Symbols también pueden ser útiles para la depuración, ya que permiten adjuntar metainformación a objetos sin afectar su comportamiento operativo.

Ejemplo: Añadir información de depuración

javascript— editable

Estos ejemplos ilustran cómo los Symbols pueden aprovecharse en escenarios prácticos para gestionar las propiedades de los objetos de forma más segura, ampliar la funcionalidad sin interferencias y facilitar técnicas de programación avanzadas en JavaScript.

Symbols conocidos

JavaScript predefine un conjunto de Symbols "conocidos" en el propio objeto Symbol — por ejemplo Symbol.iterator, Symbol.toPrimitive, Symbol.toStringTag y Symbol.hasInstance. Estos no están en el registro global; son hooks fijos que el lenguaje consulta en momentos específicos. Implementar uno en tu objeto te permite personalizar el comportamiento integrado.

Personalizar la conversión a primitivo con Symbol.toPrimitive

Cuando un objeto se usa en un contexto donde se espera un primitivo — interpolación de string, aritmética, comparación — JavaScript llama al método Symbol.toPrimitive del objeto (si existe), pasando un hint de "string", "number" o "default". Esto te da un único lugar para controlar toda la coerción, en lugar de sobrescribir toString y valueOf por separado. Para el conjunto completo de reglas, consulta Conversión de objeto a primitivo.

javascript— editable

Como la lógica de conversión vive detrás de una clave symbol, nunca colisiona con tus propias propiedades de datos y nunca aparece en JSON.stringify.

Conclusión

Los Symbols en JavaScript ofrecen una forma robusta de gestionar identificadores únicos y permiten a los desarrolladores manejar las propiedades de los objetos con un alto grado de control y privacidad. Al usar Symbols, puedes asegurarte de que las propiedades se utilicen de forma adecuada, evitando efectos secundarios no deseados.

Práctica

Práctica
¿Cuáles son algunas características del tipo Symbol de JavaScript?
¿Cuáles son algunas características del tipo Symbol de JavaScript?
Was this page helpful?