--- title: const slug: Web/JavaScript/Reference/Statements/const tags: - ECMAScript6 - ES6 - JavaScript - Referencia - constantes translation_of: Web/JavaScript/Reference/Statements/const ---
Constantes possuem escopo de bloco, semelhantes às variáveis declaradas usando o palavra-chave let
. O valor de uma constante não pode ser alterado por uma atribuição, e ela não pod ser redeclarada.
A declaração const
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.
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]]];
nameN
valueN
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 window
, diferente da criação de variáveis com var
.
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).
A declaração const
cria uma referência somente leitura a um valor. Isso não 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.
Todas as considerações de "temporal dead zone" se aplicam tanto a let
quanto a const
.
Uma constante não pode ter o mesmo nome que uma função ou variável que esteja no mesmo escopo.
O exemplo abaixo demonstra o comportamento de uma constante. Experimente executá-lo no console do seu navegador.
// 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'];
Especificação | Status | Comentário |
---|---|---|
{{SpecName('ES6', '#sec-let-and-const-declarations', 'Let and Const Declarations')}} | {{Spec2('ES6')}} | Nenhuma mudança. |
{{SpecName('ESDraft', '#sec-let-and-const-declarations', 'Let and Const Declarations')}} | {{Spec2('ESDraft')}} | Definição inicial. |
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | {{CompatUnknown}} | 36.0 (maybe earlier) | IE11 | 12.00 (maybe earlier) | 5.1.7 (maybe earlier) |
Reassignment fails |
{{ CompatChrome(20) }} | {{ CompatGeckoDesktop(13) }} | IE11 | {{CompatUnknown}} | {{CompatUnknown}} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Reassignment fails | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Em versões anteriores do Firefox & Chrome e a partir de Safari 5.1.7 e Opera 12.00, se você define uma variável com const
, 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.
A declaração const
foi implementada no Firefox muito antes de const
aparecer na especificação ECMAScript 6. For const
ES6 compliance see {{bug(950547)}} and {{bug(611388)}}.
{const a=1};a
passa a retornar ReferenceError
e não retorna 1
devido block-scoping.const a;
passa a retornar SyntaxError
("missing = in const declaration"
): É necessário incializar a constante.const a = 1; a = 2;
passa a retornar SyntaxError
("invalid assignment to const a").