aboutsummaryrefslogtreecommitdiff
path: root/files/pt-br/web/javascript/reference/statements/const/index.html
blob: 64aa4c2fc61dbb3d210c679784fd0951f50b651a (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
---
title: const
slug: Web/JavaScript/Reference/Statements/const
tags:
  - ECMAScript6
  - ES6
  - JavaScript
  - Referencia
  - constantes
translation_of: Web/JavaScript/Reference/Statements/const
---
<div>{{jsSidebar("Statements")}}</div>

<p>Constantes possuem escopo de bloco, semelhantes às variáveis declaradas usando o palavra-chave <code><a href="/en-US/docs/Web/JavaScript/Reference/Statements/let">let</a></code>. O valor de uma constante não pode ser alterado por uma atribuição, e ela não pod ser redeclarada.</p>

<div>{{EmbedInteractiveExample("pages/js/statement-const.html")}}</div>

<div class="hidden">O código-fonte deste exempllo interativo está armazenado em um repositório do GitHub. Se você desejar contribuir para o projeto de exemplos interativos, por favor, clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> e nos envie um pull request.</div>

<h2 id="Summary" name="Summary">Resumo</h2>

<p><strong> declaração <code>const</code></strong> cria uma variável cujo o valor é fixo, ou seja, uma constante somente leitura. Isso não significa que o valor é imutável, apenas que a variável constante não pode ser alterada ou retribuída.</p>

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

<pre class="syntaxbox notranslate">const <em>name1 = <em>value1 [</em>, <em>name2</em> = <em>value2</em><em> [</em>, ... [</em>, <em>nameN</em> = <em>valueN]]]]</em>;</pre>

<dl>
 <dt><code>nameN</code></dt>
 <dd>Nome da constante. Pode ser qualquer <a href="https://developer.mozilla.org/en-US/docs/Glossary/Identifier"> identificador </a> válido.</dd>
 <dt><code>valueN</code></dt>
 <dd>Valor atribuido a constante. Pode ser qualquer <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions">expressão </a> válida, incluindo uma função.</dd>
</dl>

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

<p>Esta declaração cria uma constante que pode pertencer tanto ao escopo global (na janela ou objeto) quanto ao local do bloco em que é declarada. Constantes globais não se tornam propriedades do objeto <code>window</code>, diferente da criação de variáveis com <code>var</code>.</p>

<p>Toda constante requer um inicializador, ou seja, é preciso especificar um valor para a constante no momento em que ela é declarada (o que faz sentido, uma vez que esse valor não pode ser alterado).</p>

<p>A declaração <strong><code>const</code> </strong>cria uma referência somente leitura a um valor. Isso <strong>não </strong>significa que esse valor é imutável, apenas que o identificador da variável constante não pode ser alterado. Se o conteúdo do identificador for um objeto, isso significa que o conteúdo do objeto (ex. seus parâmetros) podem ser alterados.</p>

<p>Todas as considerações de <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let">"temporal dead zone"</a> se aplicam tanto a <strong><code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let">let</a></code></strong> quanto a <strong><code>const</code></strong>.</p>

<p>Uma constante não pode ter o mesmo nome que uma função ou variável que esteja no mesmo escopo.</p>

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

<p>O exemplo abaixo demonstra o comportamento de uma constante. Experimente executá-lo no console do seu navegador.</p>

<pre class="brush:js notranslate">// NOTA: constantes podem ser declaradas em caixa alta ou baixa,
// mas uma convenção comum é usar apenas caixa alta

// define MY_FAV como uma constante e lhe atribui o valor 7
const MY_FAV = 7;

// isto falha mas não emite erros no Firefox e Chrome (porém não falha no Safari)
MY_FAV = 20;

// a variável MY_FAV possui o valor 7
console.log("my favorite number is: " + MY_FAV);

// tentar redeclarar a constante emite um erro - Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;

// o nome MY_FAV está reservado para a constante acima, logo também irá falhar
var MY_FAV = 20;

// isso também vai falhar
let MY_FAV = 20;

// É importante notar a natureza de escopo por bloco
if (MY_FAV === 7) {
    // não tem problema fazer isso, pois cria uma variável de bloco MY_FAV
    // com escopo local (o nome MY_FAV poderia ser usado com let também)
    let MY_FAV = 20;

    // MY_FAV agora é 20
    console.log("meu número favorito é " + MY_FAV);

    // isso retorna um erro, pois tenta registrar a variável no contexto global
    var MY_FAV = 20;
}

//MY_FAV ainda é 7
console.log('meu número favorito é ' + MY_FAV);

// const deve ser inicializada
const FOO; // SyntaxError: missing = in const declaration

// const também funciona com objetos
const MY_OBJECT = {'key':'value'};

// Sobrescrever o objeto também falha (no Firefox e Chrome mas não no Safari) - Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {"OTHER_KEY": "value"};

// Entretanto, atributos de objetos não estão protegidos,
// logo a seguinte instrução é executada sem problemas
MY_OBJECT.key = "otherValue"; // Utilize Object.freeze() se quiser tornar um objeto imutável

// o mesmo se aplica para arrays
const MY_ARRAY = [];
// É possível utilizar push para incluir itens no array
MY_ARRAY.push('A'); //["A"]
// Todavia, atribuir um novo array para a variável gera um erro
MY_ARRAY = ['B'];
</pre>

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

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Especificação</th>
   <th scope="col">Status</th>
   <th scope="col">Comentário</th>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td>Nenhuma mudança.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>Definição inicial.</td>
  </tr>
 </tbody>
</table>

<h2 id="Compatibilidade_nos_navegadores">Compatibilidade nos navegadores</h2>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatUnknown}}</td>
   <td>36.0 (maybe earlier)</td>
   <td>IE11</td>
   <td>12.00 (maybe earlier)</td>
   <td>5.1.7 (maybe earlier)</td>
  </tr>
  <tr>
   <td>
    <p>Reassignment fails</p>
   </td>
   <td>{{ CompatChrome(20) }}</td>
   <td>{{ CompatGeckoDesktop(13) }}</td>
   <td>IE11</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td>Reassignment fails</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<h3 id="Observações">Observações</h3>

<p>Em versões anteriores do Firefox &amp; Chrome e a partir de Safari 5.1.7 e Opera 12.00, se você define uma variável com <code>const</code>, você ainda consegue alterar o valor depois. Este recurso não é suportado no Internet Explorer 6-10, mas está incluído no Internet Explorer 11.</p>

<h3 id="Observações_específicas_para_Firefox">Observações específicas para Firefox</h3>

<p> A declaração <code>const</code> foi implementada no Firefox muito antes de <code>const</code> aparecer na especificação ECMAScript 6. For <code>const</code> ES6 compliance see {{bug(950547)}} and {{bug(611388)}}.</p>

<ul>
 <li>Iniciando com o Gecko 36 {{geckoRelease("36")}}:
  <ul>
   <li><code>{const a=1};a</code> passa a retornar <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError" title="The ReferenceError object represents an error when a non-existent variable is referenced."><code>ReferenceError</code></a> e não retorna <code>1</code> devido block-scoping.</li>
   <li><code>const a;</code> passa a retornar <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError" title="The SyntaxError object represents an error when trying to interpret syntactically invalid code."><code>SyntaxError</code></a> ("missing = in const declaration<code>"</code>): É necessário incializar a constante.</li>
   <li><code>const a = 1; a = 2;</code> passa a retornar <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError" title="The SyntaxError object represents an error when trying to interpret syntactically invalid code."><code>SyntaxError</code></a> ("invalid assignment to const a").</li>
  </ul>
 </li>
</ul>

<h2 id="See_also" name="See_also">Veja também</h2>

<ul>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/var"><code>var</code></a></li>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/let"><code>let</code></a></li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Constants">Guia de constantes em JavaScript</a></li>
</ul>