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.hasInstance
Symbol.iterator
Symbol.toPrimitive
Tienen 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
Symbol
Sin 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)
.