--- title: Símbolo slug: Web/JavaScript/Reference/Global_Objects/Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
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")}}.
Symbol([descrição])
descrição {{optional_inline}}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 {{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"
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.
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.
Symbol.lengthSymbol 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:
for...of.Symbol protótipoTodos os símbolos herdados de {{jsxref("Symbol.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}
typeof com símbolosO operador {{jsxref("Operators/typeof", "typeof")}} pode ajudar a identificar os símbolos.
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
Algumas anotações quando trabalhando com conversão de tipo de símbolos.
+sym or sym | 0).Object(sym) == sym retorna true.Symbol("foo") + "bar" lança um {{jsxref("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 {{jsxref("Symbol.prototype.toString()")}} com símbolos, mas note que uma new String(sym) será lançada.for...in iteraçãoSímbolos não são visíveis em for...in iterações. Além de, {{jsxref("Object.getOwnPropertyNames()")}} não retornará propriedades do objeto símbolo, entretanto, 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"
}
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()")}}.
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
| Specification | Status | Comment |
|---|---|---|
| {{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES2015')}} | Definição inicial. |
{{ 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() }} |