--- title: Símbolo slug: Web/JavaScript/Reference/Global_Objects/Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
{{JSRef("Global_Objects", "Symbol")}}

Sumário

A 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 {{Glossary("Symbol", "no verbete do glossário para Symbol")}}.

O tipo de dado símbolo é um {{Glossary("Primitive", "tipo de dado primitivo")}}.

Sintaxe

Symbol([descrição])

Parametros

descrição {{optional_inline}}
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.

Descrição

Para criar um novo simbolo primitivo, simplesmente escreva Symbol() com uma string opçional para sua descrição:

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");

O codigo acima cria três simbolos novos. Note que a função Symbol("foo") não faz a string "foo" ser um símbolo. Ela cria um novo simbolo a cada vez que é chamada:

Symbol("foo") === Symbol("foo"); // false

A sintaxe a seguir com o operador {{jsxref("Operators/new", "new")}} vai resultar em um  {{jsxref("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 {{jsxref("Symbol.for()")}} e {{jsxref("Symbol.keyFor()")}} para definir e configurar símbolos no registro global de símbolo.

Encontrando propriedades de símbolos em objetos

O método {{jsxref("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.

Propriedades

Symbol.length
Propriedade de tamanho cujo valor é 1.
{{jsxref("Symbol.prototype")}}
Representa o protótipo do Symbol construtor.

Símbolos conhecidos

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:

Symbol.hasInstance
Especificado como @@hasInstance. Um método que determina se um construtor de um objeto é reconhecido como a instancia de um objeto. Usado por {{jsxref("Operators/instanceof", "instanceof")}}.
Symbol.isConcatSpreadable
Especificado como @@isConcatSpreadable. Um valor Booleano indicando se um objeto deve ser adicionado como elemento de uma array. Usado por {{jsxref("Array.prototype.concat()")}}.
Symbol.isRegExp
Especificado como @@isRegExp. Um valor Booleano indicando se um objeto pode ser usado como uma expressão regular.
Symbol.iterator
Especificado como @@iterator. Um método retornando o iterador padrão para um objeto. Usado por for...of.
Symbol.toPrimitive
Especificado como @@toPrimitive. Um método convertendo um objeto para um valor primitivo .
Symbol.toStringTag
Especificado como @@toStringTag. Um valor string usado para descrição padrão de um objeto. Usado por {{jsxref("Object.prototype.toString()")}}
Symbol.unscopables
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.

Métodos

{{jsxref("Symbol.for()", "Symbol.for(key)")}}
Procura por símbolos existentes com as chaves dada e retorna as chaves se for encontradas. Caso contrário um novo símbolo vai ser criado no registro de símbolo global com essa chave.
{{jsxref("Symbol.keyFor", "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 {{jsxref("Symbol.prototype")}}.

Propriedades

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}

Métodos

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}

Exemplos

Usando o typeof operador com símbolos

O {{jsxref("Operators/typeof", "typeof")}} operador pode ajudar a identificar os símbolos.

typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'

Conversões de tipos de símbolo

Algumas anotações quando trabalhando com conversão de tipo de símbolos.

Símbolos e for...in iteração

Símbolos não são visíveis em for...in iterações. Além de , {{jsxref("Object.getOwnPropertyNames()")}} não retornará o objeto símbolo propriedade, entretante, você pode fazer uso do {{jsxref("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 {{jsxref("JSON.stringify()")}}.

Objeto wrapper de símbolo como chave de propriedade

Quando um objeto wrapper de um símbolo é usado como uma chave de propriedade , esse objeto vai 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

Specification Status Comment
{{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} {{Spec2('ES2015')}} Definição inicial.

Compatibilidade do navegador

{{ CompatibilityTable() }}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{CompatChrome(38)}} {{CompatGeckoDesktop("36.0")}} {{ CompatNo() }} 25 {{ CompatNo() }}
Symbol.iterator (@@iterator) {{CompatChrome(38)}} {{CompatGeckoDesktop("36.0")}} {{ CompatNo() }} 25 {{ CompatNo() }}
Symbol.unscopables (@@unscopables) {{CompatChrome(38)}} {{ CompatNo() }} {{ CompatNo() }} 25
{{ CompatNo() }}
Other well-known symbols {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{ CompatNo() }} {{CompatChrome(38)}} {{ CompatGeckoMobile("36.0") }} {{ CompatNo() }} 25 {{ CompatNo() }}
Symbol.iterator (@@iterator) {{ CompatNo() }} {{CompatChrome(38)}} {{ CompatGeckoMobile("36.0") }} {{ CompatNo() }} 25 {{ CompatNo() }}
Symbol.unscopables (@@unscopables)
{{ CompatNo() }} {{CompatChrome(38)}} {{ CompatUnknown() }} {{ CompatNo() }} 25 {{ CompatNo() }}
Other well-known symbols {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}

Veja também