aboutsummaryrefslogtreecommitdiff
path: root/files/pt-br/web/javascript/reference/global_objects/weakmap/index.html
blob: 081960516b8e28b0d8e63fb05e39c13f40b1f171 (plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
---
title: WeakMap
slug: Web/JavaScript/Reference/Global_Objects/WeakMap
translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap
---
<div>{{JSRef("Global_Objects", "WeakMap")}}</div>

<h2 id="Sumário">Sumário</h2>

<p>O objeto WeakMap é uma coleção de pares key/value na qual as chaves são fracamente referenciadas.<br>
 As chaves <strong>devem </strong>ser objetos, e os valores podem ser de tipos arbitrários.</p>

<p>Você pode descobrir mais sobre <code>WeakMap</code>s na seção {{SectionOnPage("/en-US/docs/Web/JavaScript/Guide/Keyed_collections", "WeakMap object")}}.</p>

<h2 id="Syntax" name="Syntax">Sintaxe</h2>

<pre class="syntaxbox"><code>new WeakMap([iterable])
</code></pre>

<h3 id="Parameters" name="Parameters">Parâmetros</h3>

<dl>
 <dt><code>iterable</code></dt>
 <dt><span style="font-weight: normal; line-height: 1.5;">Iterable é um Array ou outro objeto iterável cujos elementos são pares key-value (Arrays de dois elementos). Cada par key-value será adicionados ao novo <code>WeakMap</code><code>null</code> é tratado como <code>undefined</code>.</span></dt>
</dl>

<h2 id="Descrição">Descrição</h2>

<h3 id="Por_quê_WeakMap">Por quê <em>Weak</em>Map?</h3>

<p><span style="line-height: 1.5;">Um programador JavaScript experiente vai notar que esta API pode ser implementada em JavaScript com dois arrays (um para chaves, um para valores) compartilhado pelos 4 métodos da API. Tal implementação teria duas principais incoveniências. A primeira é uma busca O(n) (n sendo o número de chaves no map). A segunda é o problema de memory leak. Com maps escritos manualmente, o array de chaves guardaria referências para objetos chave, prevenindo-os de serem coletados pelo Garbage Collector. Nos WeakMaps nativos, referências aos objetos chave são segurados de modo "fraco", o que significa que eles não previnem a coleção pelo GC no caso de não haver nenhuma outra referência ao objeto. </span></p>

<p><span style="line-height: 1.5;">Por conta das referências serem fracas, chaves de <code>WeakMap</code> não são enumeráveis (i.e. não existe um método que dá a você uma lista de chaves). Se existisse tal método, a lista dependeria no estado da coleção do GC, introduzindo não-determinismo. Se você quiser ter uma lista de chaves, deve usar um {{jsxref("Map")}}</span></p>

<h2 id="Properties" name="Properties">Propriedades</h2>

<dl>
 <dt><code>WeakMap.length</code></dt>
 <dd>O valor da propriedade <code>length</code> é 0.</dd>
 <dt>{{jsxref("WeakMap.prototype")}}</dt>
 <dd>Representa o prototype para o constructor <code>WeakMap</code>. Permite a adição de propriedades para todos os objetos <code>WeakMap</code>.</dd>
</dl>

<h2 id="Boolean_instances" name="Boolean_instances"><font face="Courier New, Andale Mono, monospace">Instâncias <code>WeakMap</code></font></h2>

<p>Todas as instâncias <code>WeakMap</code> herdam de {{jsxref("WeakMap.prototype")}}.</p>

<h3 id="Propriedades">Propriedades</h3>

<p>{{page('pt-BR/docs/JavaScript/Reference/Global_Objects/WeakMap/prototype','Propriedades')}}</p>

<h3 id="Métodos">Métodos</h3>

<p>{{page('pt-BR/Web/JavaScript/Reference/Global_Objects/WeakMap/prototype','Metodos')}}</p>

<h2 id="Exemplos">Exemplos</h2>

<h3 id="Exemplo_Usando_WeakMap">Exemplo: Usando <code>WeakMap</code></h3>

<pre class="brush: js">var wm1 = new WeakMap(),
    wm2 = new WeakMap(),
    wm3 = new WeakMap();
var o1 = {},
    o2 = function(){},
    o3 = window;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // um valor pode ser qualquer coisa, incluindo um objeto or uma função
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // chaves e valores pode ser quaisquer objetos. Até mesmo WeakMaps!

wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, pois não existe valor para o2 em wm2
wm2.get(o3); // undefined, pois este é o valor definido

wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (mesmo se o valor armazenado for 'undefined')

wm3.set(o1, 37);
wm3.get(o1); // 37
wm3.clear();
wm3.get(o1); // undefined, pois wm3 foi 'limpado' e não há mais valor para o1.

wm1.has(o1);   // true
wm1.delete(o1);
wm1.has(o1);   // false
</pre>

<h2 id="Specifications" name="Specifications">Especificações</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">Especificações</th>
   <th scope="col">Status</th>
   <th scope="col">Comentário</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ES2015', '#sec-weakmap-objects', 'WeakMap')}}</td>
   <td>{{Spec2('ES2015')}}</td>
   <td>Definição inicial.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-weakmap-objects', 'WeakMap')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility">Compatibilidade com navegadores</h2>

<p><br>
 {{Compat("javascript.builtins.WeakMap")}}</p>

<div id="compat-mobile"> </div>

<h2 id="Veja_também">Veja também</h2>

<ul>
 <li><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=547941">WeakMap bug at Mozilla</a></li>
 <li><a href="http://fitzgeraldnick.com/weblog/53/">Hiding Implementation Details with ECMAScript 2015 WeakMaps</a></li>
 <li>{{jsxref("Map")}}</li>
 <li>{{jsxref("Set")}}</li>
 <li>{{jsxref("WeakSet")}}</li>
</ul>