Symbol
é um tipo especial em JavaScript
. Especialmente, todos os valores do tipo Symbol
são diferentes uns dos outros. Podemos usar "Símbolo" para representar um valor único. A seguir está um exemplo de criação de um objeto Symbol
:
let id = Símbolo();
Desta forma, criamos um valor do tipo Symbol
e armazenamos esse valor na variável id
.
Quando criamos uma variável do tipo Symbol
, podemos passar algumas strings com atributos de segundos nos parâmetros para descrever as informações de propósito desta variável.
Por exemplo:
let id1 = Symbol('O id de Xiao Ming que é louco e legal'); let id2 = Symbol('ID discreto, luxuoso e conotativo de Tingting');
Os tipos Symbol
são diferentes a qualquer momento, mesmo que tenham as mesmas informações de descrição, a descrição é apenas um rótulo e não tem outra finalidade
. id1 = Símbolo('id'); deixe id2 = Símbolo('id'); console.log(id1==id2);//
O significado do rótulo falso, eu pessoalmente acho que está relacionado ao fato de que Symbol
não pode ver intuitivamente o valor específico interno. Ao adicionar uma informação de descrição, podemos ter uma informação mais intuitiva. compreensão do uso de variáveis.
A maioria dos tipos em JavaScript
pode ser convertida diretamente em um tipo de string para saída, portanto, não podemos ver intuitivamente qual é seu valor. Por exemplo, podemos usar alert(123)
diretamente para converter o número 123
Converter em pop-up de string.
Porém, o tipo Symbol
é especial e não pode ser convertido diretamente, por exemplo:
let id = Symbol(); alert(id);//Relatório de erro, o tipo Símbolo não pode ser convertido
em uma string Symbol
em JavaScript
não pode ser convertido em uma string devido ao seu mecanismo inerente de "proteção de linguagem" para evitar confusão de linguagem, porque strings e Symbol
são. essencialmente diferente Há uma diferença e uma não deve ser convertida na outra.
Imagine só, se Symbol
puder ser convertido em uma string, ele se tornará uma função que gera uma string única e não há necessidade de um tipo de dados independente.
Se realmente quisermos saber o valor da variável Symbol
, podemos usar o método .toString()
da seguinte forma:
let id = Symbol('this is identification'); console.log(id.toString());//Symbol(isto é identificação);
Ou use o atributo .description
para obter as informações de descrição:
let id = Symbol('Vamos, me dê Oli'); console.log(id.description);//Vamos, Ollie”
De acordo com as especificações JavaScript
, apenas dois tipos de valores podem ser usados como chaves de propriedade do objeto:
. outros tipos são usados. Ele será convertido implicitamente em um tipo de string. A chave do objeto é apresentada em detalhes no capítulo anterior e não será repetida aqui.
Existem duas Symbol
Exemplo 1:
deixe id = Símbolo('id'); deixe usuário = {}; user[id] = 'id value';//Adicionar chave de símbolo console.log(user[id]);//id value
Exemplo 2:
let id = Symbol('id'); deixe usuário = { [id]:'id value',//observe os colchetes aqui }; console.log(user[id]);
Os dois casos acima mostram o uso da inserção Symbol
como chave no objeto. Deve-se observar que ao acessar o atributo, é necessário usar obj[id]
em vez de obj.id
, porque obj.id
representa obj['id']
.
O que acontecerá se usarmos Symbol
como chave do objeto?
Symbol
for...in é que se o objeto usar Symbol
como chave, então Symbol
não poderão ser acessadas usando for…in
.
Por exemplo:
deixe id = Símbolo('id'); deixe usuário = { nome: 'xiaoming', [eu fiz', }; for (let key in user) console.log(user[key]);
Execute o código acima e obtenha os seguintes resultados:
> Xiaoming
pode descobrir que o valor do objeto [id]
não está impresso, indicando que no objeto lista de atributos, use for … in
ignorará automaticamente as chaves do tipo Symbol
.
Da mesma forma, Object.keys(user)
irá ignorar todas as chaves do tipo Symbol
.
Este recurso pode trazer efeitos muito úteis, por exemplo podemos criar propriedades que somente nós podemos usar.
Embora não tenhamos como obter diretamente a chave Symbol
, Object.assign
pode copiar todas as propriedades:
let id = Symbol(); deixe obj = { [id]: '123' } deixe obj2 = Object.assign({},obj); console.log(obj2[id]);
Isso não afeta as propriedades ocultas de Symbol
, porque o objeto copiado ainda não pode obter a chave Symbol
.
Como Symbol
não pode ser convertido diretamente em uma string, não temos como obter seu valor intuitivamente, nem podemos obter Symbol
atributo Symbol
do objeto por meio for … in
não temos como obter as propriedades correspondentes dentro do objeto.
Portanto, através do valor chave do tipo Symbol
, podemos ocultar as propriedades. Essas propriedades só podem ser acessadas por nós mesmos e ninguém mais pode ver nossas propriedades.
Por exemplo:
Durante o processo de desenvolvimento, precisamos cooperar com nosso colega "Zhang San", e este Zhang San criou uma Tool
. Queremos usar Tool
Tool
de Zhang San gratuitamente. e adicione algumas de suas próprias propriedades com base nisso.
Podemos adicionar uma chave do tipo Symbol
:
let tool = {//Tool escrita por Zhang San uso: "Pode fazer qualquer coisa", } deixe nome = Símbolo("Minha ferramenta obj"); tool[name] = "Esta é minha ferramenta"; console.log(tool[name]);
O exemplo acima mostra como adicionar suas próprias propriedades a um objeto escrito por outros, então por que usar Symbol
em vez de uma string normal?
As razões são as seguintes:
tool
de objeto é um código escrito por terceiros. Em princípio, não devemos modificar o código de outras pessoas, pois isso causará riscosde
Symbol
Symbol
, porque Symbol
são diferentes;
Se não usarmos o tipo Symbol
, é provável que ocorra a seguinte situação:
let tool = {//Tool escrita por Zhang San uso: "Pode fazer qualquer coisa", } tool.usage = "Boom Boom"; console.log(tool.usage);
O código acima reutiliza "uso" e, portanto, reescreve os atributos originais, o que fará com que a função original do objeto seja anormal.
Todas as variáveis Symbol
são diferentes, mesmo que tenham o mesmo rótulo (descrição).
Às vezes, queremos acessar o mesmo objeto Symbol
através de um nome de string (rótulo), por exemplo, acessamos o mesmo Symbol
em locais diferentes do código.
JavaScript
mantém um registro global Symbol
. Podemos acessar o objeto inserindo um objeto Symbol
no registro e dando ao objeto um nome de string.
Para inserir ou ler um objeto Symbol
no registro, você precisa usar Symbol.for(key)
Se houver um objeto chamado key
no registro, o objeto será retornado, um novo objeto será inserido e. voltou.
Por exemplo:
let id1 = Symbol.for('id');//Não existe nenhum símbolo chamado id no registro, crie e retorne let id2 = Symbol.for('id');//Já existe um símbolo chamado id no registro Para o Símbolo com id, retorne diretamente console.log(id1===id2);//true.
Através de Symbol.for(key)
podemos usar Symbol
como uma variável global e usar uma string para marque o nome do objeto.
Pelo contrário, também podemos usar Symbol.keyFor(Symbol)
para obter o nome do objeto ao contrário.
Por exemplo:
let id = Symbol.for('id'); //Não há nenhum símbolo chamado id no registro, crie e retorne let name = Symbol.keyFor(id); console.log(name);//id
A função Symbol.keyFor()
só pode ser usada em undefined
Symbol
globais (objetos inseridos usando Symbol.for
).
Por exemplo:
let id = Symbol('id'); //símbolo local deixe nome = Symbol.keyFor (id);console.log(name);//
indefinido
JavaScript
tem muitos Symbol
de sistema, como:
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
Eles têm seus próprios usos.
Symbol
é único.Symbol
do objeto no registro global através do rótuloSymbol
, pois a chave do objeto não pode ser detectada for … in
;Symbol
O objeto Symbol
global,entretanto, Symbol
não está completamente oculto. Podemos obter todos Symbol
do objeto por meio de Object.getOwnPropertySymbols(obj)
ou obter todas as chaves do objeto por meio de Reflect.ownKeys(obj)
.