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
¿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
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
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
// 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
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
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 usa
symbolel 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
Otras extensionesRecomendación:Usa Symbol cuando necesites crear identificadores únicos, evitar conflictos de nombres de propiedad o necesites propiedades "privadas".