Baseline Widely available *
SumárioA função Symbol()
retorna um valor do tipo sÃmbolo (symbol), tem propriedades estáticas que expõem vários membros dos objetos nativos, possuem métodos estáticos que expõem o registro de sÃmbolos globais e se parecem com uma classe de objeto nativo, mas estão incompletos como construtor porque não suportam a sintaxe "new Symbol()
".
Cada valor sÃmbolo retornado de Symbol()
é único. Um sÃmbolo pode ser usado como o identificador para propriedades de objetos; esse é o único propósito do tipo de dado. Algumas explicações sobre propósito e uso podem ser encontradas no verbete do glossário para Symbol.
O tipo de dado sÃmbolo é um tipo de dado primitivo.
Sintaxe Parâmetrosdescrição
Optional
String opcional. Uma descrição de sÃmbolo no qual pode ser usado para debugar, mas não para acessar o próprio sÃmbolo.
Para criar um novo sÃmbolo primitivo, simplesmente escreva Symbol()
com uma string opcional para sua descrição:
var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
O código acima cria três sÃmbolos novos. Note que a função Symbol("foo") não faz a string "foo" ser um sÃmbolo. Ela cria um novo sÃmbolo a cada vez que é chamada:
Symbol("foo") === Symbol("foo"); // false
A sintaxe a seguir com o operador new
vai resultar em um TypeError
:
var sym = new Symbol(); // TypeError
Isso evita que os autores criem um objeto empacotador explÃcito de Symbol
em vez de um novo valor de sÃmbolo. O que pode surpreender, pois, geralmente é possÃvel criar objetos empacotadores explÃcitos em torno de tipos de dados primitivos (por exemplo, new Boolean
, new String
e new Number
).
Se você realmente quiser criar um objeto empacotador de Symbol
, você pode usar a função Object()
:
var sym = Symbol("foo");
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"
SÃmbolos compartilhados no registro global de sÃmbolo
A sintaxe acima usando a função Symbol()
não criará um sÃmbolo global que estará disponÃvel em todo o seu código. Para criar sÃmbolos disponÃveis em vários arquivos em um escopo como se fosse global, use os métodos Symbol.for()
e Symbol.keyFor()
para definir e configurar sÃmbolos no registro global de sÃmbolo.
O método Object.getOwnPropertySymbols()
retorna um array de sÃmbolos e permite que você encontre propriedades de sÃmbolos em um determinado objeto. Observe que cada objeto é inicializado sem suas próprias propriedades de sÃmbolo, de modo que este array estará vazio, a menos que você estabeleça propriedades de sÃmbolo no objeto.
Symbol.length
Propriedade de tamanho cujo valor é 1.
Symbol.prototype
Representa o protótipo do Symbol
construtor.
Em adição para seus próprios sÃmbolos, JavaScript possui alguns sÃmbolos built-in que representa os comportamentos internos da linguagem que não foram revelados para os desenvolvedores no ECMAScript 5 e anterior. Esses sÃmbolos podem ser acessados usando as seguintes propriedades:
Especificado como @@hasInstance. Um método que determina se um construtor de um objeto é reconhecido como a instância de um objeto. Usado por instanceof
.
Especificado como @@isConcatSpreadable. Um valor Booleano indicando se um objeto deve ser adicionado como elemento de uma array. Usado por Array.prototype.concat()
.
Especificado como @@isRegExp. Um valor Booleano indicando se um objeto pode ser usado como uma expressão regular.
Especificado como @@iterator. Um método retornando o iterador padrão para um objeto. Usado por for...of
.
Especificado como @@toPrimitive. Um método convertendo um objeto para um valor primitivo.
Especificado como @@toStringTag. Um valor string usado para descrição padrão de um objeto. Usado por Object.prototype.toString()
Especificado como @@unscopables. Uma Array com valores string que são valores propriedade. Esses são excluÃdos das ligações com o objeto associado.
Symbol.for(key)
Procura por sÃmbolos existentes com as chaves dada e retorna as chaves se forem encontradas. Caso contrário um novo sÃmbolo será criado no registro de sÃmbolo global com essa chave.
Symbol.keyFor(sym)
Retorna um sÃmbolo compartilhado do registro global de sÃmbolo para o sÃmbolo dado.
Symbol
protótipo
Todos os sÃmbolos herdados de Symbol.prototype
.
typeof
com sÃmbolos
O operador typeof
pode ajudar a identificar os sÃmbolos.
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
Conversões de tipos de sÃmbolos
Algumas anotações quando trabalhando com conversão de tipo de sÃmbolos.
TypeError
será retornado. (e.g. +sym
or sym | 0
).Object(sym) == sym
retorna true
.Symbol("foo") + "bar"
lança um TypeError
(não pode converter um sÃmbolo para string). Isso previne você de silenciosamente criar um novo nome de propriedade string a partir de um sÃmbolo, por exemplo.String(sym)
conversion funciona como uma chamada para Symbol.prototype.toString()
com sÃmbolos, mas note que uma new String(sym)
será lançada.for...in
iteração
SÃmbolos não são visÃveis em for...in
iterações. Além de, Object.getOwnPropertyNames()
não retornará propriedades do objeto sÃmbolo, entretanto, você pode fazer uso do Object.getOwnPropertySymbols()
para conseguir esses resultados.
var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (var i in obj) {
console.log(i); // logs "c" and "d"
}
SÃmbolos e JSON.stringify()
Propriedade com chave de sÃmbolo vão ser completamente ignoradas quando usando JSON.stringify()
:
JSON.stringify({ [Symbol("foo")]: "foo" });
// '{}'
Para mais detalhes, veja JSON.stringify()
.
Quando um objeto wrapper de um sÃmbolo é usado como uma chave de propriedade, esse objeto será coerced para o seu sÃmbolo wrapper:
var sym = Symbol("foo");
var obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
Especificações Compatibilidade com navegadores Veja também
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4