TypeScript Symbol

Symbol es un tipo de datos primitivo introducido en ES6, que representa un identificador único.

En TypeScript, Symbol se puede usar como clave de propiedad de un objeto, asegurando la unicidad de la propiedad.

Esto es muy útil en escenarios donde se necesitan crear propiedades privadas, evitar conflictos de nombres de propiedad, etc.


Diagrama SVG: Cómo funciona Symbol Fondo Título Características de Symbol Creación de Symbol Creación con Symbol() var sym1 = Symbol("key") var sym2 = Symbol("key") // sym1 !== sym2 Cada creación es única Flecha Propiedad de objeto Usado como clave de propiedad de objeto var obj = { [sym]: "value" } // Nombre de propiedad único Flecha Registro global Symbol.for() Registro global Misma clave (key) Igual Parte inferior: Symbol incorporado Symbols incorporados comunes Symbol incorporado 1 Symbol.iterator - iterador Symbol incorporado 2 Symbol.toStringTag - descripción del objeto Symbol incorporado 3 Symbol.hasInstance - instanceof Marca de flecha

¿Por qué se necesita Symbol?

En JavaScript, los nombres de las propiedades de los objetos son cadenas, y a veces pueden ocurrir conflictos.

Symbol proporciona una forma de crear identificadores únicos; cada llamada a Symbol() crea un valor nuevo y único.

Esto es muy útil en escenarios como la creación de propiedades privadas, la definición de constantes únicas, la implementación de iteradores, etc.

Explicación del concepto:Symbol es uno de los tipos de datos primitivos de JavaScript, creado mediante la función Symbol(). Cada valor Symbol es único; incluso si la descripción es la misma, no son iguales.


Crear Symbol

Usa la función Symbol() para crear un valor Symbol único.

Ejemplo

// Crear Symbol, pasando una cadena de descripción (opcional)
var sym1 = Symbol("description");
var sym2 = Symbol("description");

// Cada Symbol creado es único, incluso si la descripción es la misma
console.log("sym1 === sym2: " + (sym1 === sym2));
console.log("sym1: " + sym1.toString());

Resultado de ejecución:

sym1 === sym2: false
sym1: Symbol(description)

Unicidad:Esta es la característica más importante de Symbol: cada llamada a Symbol() crea un nuevo valor que no es igual a ningún otro valor.


Symbol como propiedad de objeto

Symbol se puede usar como clave de propiedad de un objeto, creando nombres de propiedad únicos.

Ejemplo

// Crear Symbol como clave de propiedad
var sym = Symbol("key");

// Usar Symbol como clave de propiedad del objeto
var obj = {
    name: "Alice",  // Propiedad de cadena normal
    [sym]: "secret value"  // Propiedad Symbol, nombre de propiedad calculado
};

// Acceder a la propiedad normal
console.log("Propiedad normal: " + obj.name);
// Acceder a la propiedad Symbol
console.log("Propiedad Symbol: " + obj[sym]);
// La propiedad Symbol no aparece en JSON
console.log("Objeto: " + JSON.stringify(obj));

Resultado de ejecución:

普通属性: Alice
Symbol 属性: secret value
对象: {"name":"Alice"}

Privacidad:Las propiedades Symbol no aparecen en la serialización JSON ni se recorren con for...in, por lo que se pueden usar para crear propiedades "privadas".


Registro global de Symbol

Usa Symbol.for() para acceder al Symbol en el registro global; la misma clave (key) devuelve el mismo Symbol.

Ejemplo

// Usar el método Symbol.for para crear/obtener un Symbol global
// Si la clave no existe, se crea una nueva; si ya existe, devuelve la existente
var globalSym1 = Symbol.for("global");
var globalSym2 = Symbol.for("global");

// Los Symbols con la misma clave son iguales
console.log("Symbol global igual: " + (globalSym1 === globalSym2));

// Obtener la clave del Symbol
console.log("Symbol key: " + Symbol.keyFor(globalSym1));

Resultado de ejecución:

全局 Symbol 相等: true
Symbol key: global

Diferencia:Symbol() crea un nuevo valor cada vez; Symbol.for() busca o crea en el registro global.


Symbol incorporado

JavaScript define algunos valores Symbol incorporados para personalizar el comportamiento del lenguaje.

Ejemplo

// Symbol.iterator se usa para definir el iterador predeterminado de un objeto
var arr = [1, 2, 3];
// Obtener el iterador de una matriz
var iterator = arr[Symbol.iterator]();

// Recorrer usando el iterador
console.log("Primer elemento: " + iterator.next().value);
console.log("Segundo elemento: " + iterator.next().value);

// Symbol.toStringTag personaliza el valor de retorno de toString() de un objeto
var obj = {
    [Symbol.toStringTag]: "MyObject"
};
console.log("Tipo de objeto: " + obj.toString());

Resultado de ejecución:

第一个元素: 1
第二个元素: 2
Tipo de objeto: [object MyObject]

Importante:Los Symbols incorporados se usan para personalizar el comportamiento del lenguaje, como iteradores, conversión de tipos, etc. Son la base de las características avanzadas de JavaScript.


Anotación de tipo Symbol

En TypeScript, se usa el tipo Symbol para la anotación de tipos.

Ejemplo

// Anotación de tipo Symbol
var sym: symbol = Symbol("key");

// El tipo de clave del objeto es symbol, el valor es string
var obj: { [key: symbol]: string } = {};

// Usar Symbol como clave
obj[sym] = "value";
console.log("Valor de la propiedad Symbol: " + obj[sym]);

Tipo:En TypeScript se usasymbolel tipo symbol para anotar valores Symbol.


Consideraciones

  • Unicidad:El valor de cada llamada a Symbol() es diferente
  • No enumerable:Las propiedades Symbol no aparecen en los bucles for...in
  • Ignorado por JSON:Las propiedades Symbol no se serializan en JSON
  • Registro global:Symbol.for() se comparte en el registro global

Escenarios de aplicación:Symbol se usa a menudo para crear propiedades privadas de objetos, definir constantes únicas, evitar conflictos de nombres de propiedad, etc.


Resumen

Symbol es un tipo primitivo importante en TypeScript.

  • Unicidad:Cada Symbol creado no es igual a los demás
  • Clave de propiedad:Se puede usar como clave de propiedad única de un objeto
  • Registro global:Symbol.for() crea/obtiene un Symbol global
  • Symbol incorporado:Symbol.iterator, Symbol.toStringTag, etc.
  • Anotación de tipo:Usar el tipo symbol

Recomendación:Usa Symbol cuando necesites crear identificadores únicos, evitar conflictos de nombres de propiedad o necesites propiedades "privadas".

Otras extensiones