
Symbol es un tipo especial en JavaScript . Especialmente, todos los valores del tipo Symbol son diferentes entre sí. Podemos usar "Símbolo" para representar un valor único. El siguiente es un ejemplo de cómo crear un objeto Symbol :
let id = Símbolo()
De esta manera, creamos un valor de tipo Symbol y almacenamos este valor en la variable id .
Cuando creamos una variable de tipo Symbol , podemos pasar algunas cadenas con atributos de segundos en los parámetros para describir la información del propósito de esta variable.
Por ejemplo:
let id1 = Symbol('La identificación de Xiao Ming, que está loco y es genial');
let id2 = Symbol('ID de Tingting discreto, lujoso y connotativo'); Los tipos Symbol son diferentes en cualquier momento, incluso si tienen la misma información de descripción, la descripción es solo una etiqueta y no tiene otro propósito. Por ejemplo:
let id1 = Símbolo('id');
let id2 = Símbolo('id');
console.log(id1==id2);// El significado de la etiqueta falsa, personalmente creo que está relacionado con el hecho de que Symbol no puede ver intuitivamente el valor específico interno. Al agregar información de descripción, podemos tener una información más intuitiva. comprensión del uso de variables.
La mayoría de los tipos en JavaScript se pueden convertir directamente en un tipo de cadena para la salida, por lo que no podemos ver intuitivamente cuál es su valor. Por ejemplo, podemos usar directamente alert(123) para convertir el número 123 Convertir a ventana emergente de cadena.
Sin embargo, el tipo Symbol es especial y no se puede convertir directamente, por ejemplo:
let id = Symbol(); alert(id);// Informe de error, el tipo de símbolo no se puede convertir
en una cadena. Symbol en JavaScript no se puede convertir en una cadena debido a su mecanismo inherente de "protección del idioma" para evitar la confusión del idioma, porque las cadenas y Symbol son. esencialmente diferentes Hay una diferencia y no se debe convertir una en la otra.
Imagínese, si Symbol se puede convertir en una cadena, entonces se convierte en una función que genera una cadena única y no hay necesidad de un tipo de datos independiente.
Si realmente queremos saber el valor de Symbol , podemos usar el método .toString() de la siguiente manera:
let id = Símbolo('esto es identificación');
console.log(id.toString());//Symbol(esto es identificación); O use el atributo .description para obtener la información de descripción:
let id = Symbol('Vamos, dame Oli');
console.log(id.description);//Vamos, Ollie” Según las especificaciones JavaScript , solo se pueden usar dos tipos de valores como claves de propiedad de un objeto:
cadena
Se utilizan otros tipos. Se convertirá implícitamente a un tipo de cadena. La clave del objeto se presenta en detalle en el capítulo anterior y no se repetirá aquí.
Hay dos Symbol
Ejemplo 1:
let id = Símbolo('id');
dejar usuario = {};
user[id] = 'id value';//Agregar clave de símbolo console.log(user[id]);//id value Ejemplo 2:
let id = Symbol('id');
dejar usuario = {
[id]:'id value',//tenga en cuenta los corchetes aquí
};
console.log(user[id]); Los dos casos anteriores muestran el uso de insertar Symbol como clave en el objeto. Cabe señalar que al acceder al atributo, debe usar obj[id] en lugar de obj.id , porque obj.id representa obj['id'] .
¿Qué pasará si usamos Symbol como clave del objeto?
Symbol for...in es que si el objeto usa Symbol como clave, entonces no se puede acceder a Symbol usando for…in .
Por ejemplo:
let id = Símbolo('id');
dejar usuario = {
nombre: 'xiaoming',
[hice',
};
for (let key in user) console.log(user[key]); Ejecute el código anterior y obtenga los siguientes resultados:
> Xiaoming
puede encontrar que el valor del objeto [id] no está impreso, lo que indica que en el objeto lista de atributos, el uso for … in ignorará automáticamente las claves de tipo Symbol .
Del mismo modo, Object.keys(user) ignorará todas las claves de tipo Symbol .
Esta característica puede traer efectos muy útiles, por ejemplo podemos crear propiedades que solo nosotros podemos usar.
Aunque no tenemos forma de obtener directamente la clave Symbol , Object.assign puede copiar todas las propiedades:
let id = Symbol();
dejar objeto = {
[identificación]: '123'
}
let obj2 = Object.assign({},obj);
console.log(obj2[id]); Esto no afecta las propiedades ocultas de Symbol , porque el objeto copiado aún no puede obtener la clave Symbol .
Dado que Symbol no se puede convertir directamente en una cadena, no tenemos forma de obtener su valor intuitivamente, ni podemos obtener el atributo Symbol del objeto a través for … in En otras palabras, sin Symbol en sí, No tenemos forma de obtener las propiedades correspondientes dentro del objeto.
Por lo tanto, a través del valor clave del tipo Symbol , podemos ocultar las propiedades. Solo nosotros podemos acceder a estas propiedades y nadie más puede ver nuestras propiedades.
Por ejemplo:
durante el proceso de desarrollo, necesitamos cooperar con nuestro colega "Zhang San", y Zhang San creó una Tool muy fácil de usar. Tool es un tipo de objeto. Queremos usar Tool de Zhang San de forma gratuita. y agregue algunas de sus propias propiedades basadas en esto.
Podemos agregar una clave de tipo Symbol :
let tool = {//Herramienta escrita por Zhang San
uso: "Puede hacer cualquier cosa",
}
let nombre = Símbolo("Mi herramienta obj");
herramienta[nombre] = "Esta es mi herramienta";
console.log(tool[name]); El ejemplo anterior muestra cómo agregar sus propias propiedades a un objeto escrito por otros, entonces, ¿por qué utilizar Symbol en lugar de una cadena normal?
Las razones son las siguientes:
tool objeto es código escrito por otros. En principio, no debemos modificar el código de otras personas, ya que esto generará riesgosSymbol , porque Symbol son diferentes ySymbol , lo que significa que no entrarán en conflicto con el código de otras personas.
Si no utilizamos el tipo Symbol , es probable que ocurra la siguiente situación:
let tool = {//Herramienta escrita por Zhang San
uso: "Puede hacer cualquier cosa",
}
herramienta.usage = "Boom Boom";
console.log(tool.usage); El código anterior reutiliza "uso" y, por lo tanto, reescribe los atributos originales, lo que hará que la función original del objeto sea anormal.
Todas las variables Symbol son diferentes, incluso si tienen la misma etiqueta (descripción).
A veces, queremos acceder al mismo objeto Symbol a través de un nombre de cadena (etiqueta), por ejemplo, accedemos al mismo Symbol en diferentes lugares del código.
JavaScript mantiene un registro Symbol global. Podemos acceder al objeto insertando un objeto Symbol en el registro y dándole al objeto un nombre de cadena.
Para insertar o leer un objeto Symbol en el registro, debe utilizar Symbol.for(key) . Si hay un objeto llamado key en el registro, se devolverá el objeto. De lo contrario, se insertará un nuevo objeto. regresó.
Por ejemplo:
let id1 = Symbol.for('id');//No hay ningún símbolo llamado id en el registro, cree y devuelva let id2 = Symbol.for('id');//Ya hay un símbolo llamado id en el registro Para el símbolo con id, devuelva directamente console.log(id1===id2);//true A través de Symbol.for(key) podemos usar Symbol como una variable global y usar una cadena para. marque el nombre del objeto.
Por el contrario, también podemos usar Symbol.keyFor(Symbol) para obtener el nombre del objeto al revés.
Por ejemplo:
let id = Symbol.for('id');// No hay ningún símbolo llamado id en el registro, cree y devuelva let name = Symbol.keyFor(id);
console.log(name);//id La función Symbol.keyFor() solo se puede usar en objetos Symbol globales (objetos insertados usando Symbol.for ). Si se usa en objetos no globales, devolverá undefined .
Por ejemplo:
let id = Símbolo('id');//Símbolo local
let nombre = Symbol.keyFor(id);
console.log(name);// indefinidoSímbolo
JavaScript tiene muchos Symbol del sistema, como:
Symbol.hasInstanceSymbol.iteratorSymbol.toPrimitiveTienen sus propios usos. Introduciremos gradualmente estas variables únicas más adelante.
Symbol es único;Symbol objeto en el registro global a través de la etiqueta;Symbol ya que la clave del objeto no puede ser detectada for … in ;Symbol SymbolSin embargo, el Symbol Symbol global no está completamente oculto. Podemos obtener todos Symbol del objeto a través de Object.getOwnPropertySymbols(obj) , u obtener todas las claves del objeto a través de Reflect.ownKeys(obj) .