1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
---
title: Symbol
slug: Glossario/Symbol
translation_of: Glossary/Symbol
---
<p>Esse termo do glossário descreve tanto o tipo de dados chamado "<strong>symbol</strong>", quando a função/classe "{{jsxref("Symbol")}}<code>()</code>", que entre outras coisas, cria instâncias do tipo de dados <strong>symbol</strong>.</p>
<p>O tipo de dados "<strong>symbol</strong>" é qualificado como um primitivo, onde valores desse tipo podem ser usados para fazer propriedades de objetos anônimos. Ele pode ser usado como chave de uma propriedade de objeto quando este tem a intenção de ser privada, para uso interno da classe ou do tipo do objeto em questão. Como exemplo, chaves do tipo <strong>symbol</strong> existem em vários objetos internos do JavaScript. Da mesma forma, pode-se construir classes que tenham membros privados usando essa técnica. O tipo de dados <strong>symbol</strong> é de propósito altamente especializado, o que o torna pouco versátil; uma instância de <strong>Symbol</strong> pode ser atribuída à um L-value, e pode ter sua identidade examinada, nada mais; nenhuma outra operação poderá ser aplicada, o que contrasta, por exemplo, com uma instância de Number para um inteiro cujo valor é 42, que por sua vez tem diversas operações para comparar, combinar com outros tipos de dados, etc.</p>
<p>Um valor do tipo de dados "symbol" pode ser referenciado como um "valor symbol". Em JavaScript, um valor symbol é criado através da função <code>Symbol()</code>, que dinamicamente produz um valor único e anônimo. A única utilização sensata para para essa construção é armazená-la em uma variável que será utilizada como chave para uma propriedade de objeto cujo objetivo é torná-lo anônimo.</p>
<p>O exemplo abaixo guarda um valor symbol em uma variável <code>myPrivateMethod</code> para usar como chave do objeto <code>this</code>:</p>
<pre class="brush: js">let myPrivateMethod = Symbol();
this[myPrivateMethod] = function() {...};</pre>
<p>Quando um valor de um <strong>symbol</strong> é usado como o identificador em uma atribuição de propriedade, a propriedade (como o <strong>symbol</strong>) é anônima; e também é não-enumerável. Como a propriedade não é enumerável, ela não será mostrada como um membro na construção de loop "<code>for( ... in ...)"</code> e, como a propriedade é anônima, ela não será mostrada no <strong>array</strong> de resultados de "<code>Object.getOwnPropertyNames()</code>". A propriedade pode ser acessada usando o <strong>symbol</strong> original que a criou ou iterando o <strong>array</strong> de resultados de "<code>Object.getOwnPropertySymbols()</code> ". No exemplo de código anterior, o acesso à propriedade será através do valor armazenado na variável <code>myPrivateMethod</code>.</p>
<p>The built-in function "{{jsxref("Symbol")}}<code>()</code>" is an incomplete class that returns a symbol value when called as a function, that throws an error upon attempts to use it as a constructor with the syntax "<code>new Symbol()</code>", that has static methods for accessing JavaScript's global symbol table, and that has static properties for addressing certain symbols that are present in commonly used objects. The creation of symbol values by the <code>Symbol()</code> function was explained above. The throwing of an error upon attempts to use <code>Symbol()</code> as a constructor is explained as a precaution against the accidental creation of an object that might cause confusion. The methods that access the global symbol registry are "<code>Symbol.for()</code>" and "<code>Symbol.keyFor()</code>"; these mediate between the global symbol table (or "registry") and the run-time environment. The symbol registry is mostly built by JavaScript's compiler infrastructure, and the symbol registry's content is not available to JavaScript's run-time infrastructure, except through these reflective methods. The method <em><code>Symbol.for("tokenString")</code></em> returns a symbol value from the registry, and <em><code>Symbol.keyFor(symbolValue)</code></em> returns a token string from the registry; each is the other's inverse, so the following is true:</p>
<pre class="brush: js">Symbol.keyFor(Symbol.for("tokenString"))=="tokenString"; // true
</pre>
<p>The <strong>Symbol</strong> class has some static properties that have the ironic effect of naming the anonymous. There are only a few of these; they are for some so-called "well known" symbols. These are symbols for some selected method properties that are found in certain built-in objects. The exposure of these symbols makes it possible to have direct access to these behaviors; such access might be useful, for example, in the definition of a custom class. Examples of well-known symbols are: "<code>Symbol.iterator</code>" for array-like objects, and "<code>Symbol.search</code>" for string objects. </p>
<p>The <code>Symbol()</code> function and the symbol values it creates might be useful to programers designing a custom class. Symbol values provide a way by which custom classes can create private members, and maintain a symbol registry that pertains just to that class. A custom class can use symbol values to create "own" properties that are shielded from unwanted, casual discovery. Within the class definition, the dynamically created symbol value is saved to a scoped variable, available only privately within the class definition. There is no token string; the scoped variable plays the equivalent role of a token.</p>
<p>In some programming languages the symbol data type is referred to as an "atom." </p>
<p>In {{Glossary("JavaScript")}}, Symbol is a {{Glossary("Primitive", "primitive value")}}.</p>
<p>Symbol can have an optional description, but for debugging purposes only.</p>
<p>Symbol type is a new feature in ECMAScript 2015 and there is no ECMAScript 5 equivalent for symbol.</p>
<pre class="brush: js">Symbol("foo") !== Symbol("foo")
const foo = Symbol()
const bar = Symbol()
typeof foo === "symbol"
typeof bar === "symbol"
let obj = {}
obj[foo] = "foo"
obj[bar] = "bar"
JSON.stringify(obj) // {}
Object.keys(obj) // []
Object.getOwnPropertyNames(obj) // []
Object.getOwnPropertySymbols(obj) // [ Symbol(), Symbol() ]</pre>
<h2 id="Learn_more">Learn more</h2>
<h3 id="General_knowledge">General knowledge</h3>
<ul>
<li>{{Interwiki("wikipedia", "Symbol (programming)")}} on Wikipedia</li>
<li><a href="/en-US/docs/Web/JavaScript/Data_structures">JavaScript data types and data structures</a></li>
<li><a href="http://2ality.com/2014/12/es6-symbols.html">Symbols in ECMAScript 6</a></li>
</ul>
|