Eu sei que o ES6 ainda não está padronizado, mas muitos navegadores atualmente oferecem suporte a const
palavras-chave em JS.
Na especificação, está escrito que:
O valor de uma constante não pode ser alterado por meio da reatribuição, e uma constante não pode ser declarada novamente. Por causa disso, embora seja possível declarar uma constante sem inicializá-la, seria inútil fazê-lo.
e quando faço algo assim:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Vejo que está tudo bem, xxx
ainda está 6
e yyy
está []
.
Mas se eu fizer isso yyy.push(6); yyy.push(1);
, meu array constante foi alterado. Agora é [6, 1]
e, por falar nisso, ainda não posso mudar com yyy = 1;
.
Eu sou um bug ou estou faltando alguma coisa? Eu tentei no mais recente Chrome e FF29
javascript
ecmascript-6
const
Salvador Dalí
fonte
fonte
Respostas:
A documentação afirma:
Quando você está adicionando a um array ou objeto, você não está reatribuindo ou declarando novamente a constante, ela já está declarada e atribuída, você está apenas adicionando à "lista" para a qual a constante aponta.
Então, isso funciona bem:
e isto:
mas nenhum destes:
fonte
Isso acontece porque sua constante está, na verdade, armazenando uma referência ao array. Quando você une algo em seu array, você não está modificando seu valor constante, mas o array para o qual ele aponta. O mesmo aconteceria se você atribuísse um objeto a uma constante e tentasse modificar qualquer propriedade dela.
Se você deseja congelar uma matriz ou objeto para que não possa ser modificado, você pode usar o
Object.freeze
método, que já faz parte do ECMAScript 5.fonte
five
definida como 5 não tem realmente um valor de 5, é apenas uma referência ao número 5. Portanto, se eu fizerfive++
isso, não mudarei a constante, apenas o número para o qual ela aponta.five
aponta (a variávelfive
costumava ser um rótulo para o número 5, agora está apontando para um número diferente: 6). No exemplo da pergunta (e esta resposta),x
sempre aponta para a mesma lista; sex
for const, você não pode fazer com que aponte para uma lista diferente. A única diferença é que a mesma lista pode aumentar ou diminuir; isso é algo possível apenas para matrizes e objetos e não para primitivos.Este é um comportamento consistente com todas as linguagens de programação que posso imaginar.
Considere C - arrays são apenas ponteiros glorificados. Um array constante significa apenas que o valor do ponteiro não mudará - mas na verdade os dados contidos naquele endereço estão livres para.
Em javascript, você tem permissão para chamar métodos de objetos constantes (é claro - caso contrário, objetos constantes não serviriam a muitos propósitos!) Esses métodos podem ter o efeito colateral de modificar o objeto. Como os arrays em javascript são objetos, esse comportamento também se aplica a eles.
Você só tem certeza de que a constante sempre apontará para o mesmo objeto. As propriedades do próprio objeto podem ser alteradas.
fonte
Além disso, uma observação também importante:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
fonte
Acho que isso lhe daria mais clareza sobre o assunto: https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 .
Basicamente, tudo se resume a
const
sempre apontar para o mesmo endereço na memória. Você pode alterar o valor armazenado naquele endereço, mas não pode alterar o endereço queconst
está apontando também.A definição de
const
você mencionada será verdadeira quando oconst
estiver apontando para um endereço que contém um valor primitivo. Isso ocorre porque você não pode atribuir um valor a thisconst
sem alterar seu endereço (porque é assim que a atribuição de valores primitivos funciona) e alterar o endereço de aconst
não é permitido.Onde como se estivesse
const
apontando para um valor não primitivo, é possível editar o valor do endereço.fonte
Li este artigo enquanto pesquisava por que fui capaz de atualizar um objeto mesmo depois de defini-lo como
const
. Portanto, o ponto aqui é que não é o objeto diretamente, mas os atributos que ele contém que podem ser atualizados.Por exemplo, meu objeto se parece com:
As respostas acima indicaram corretamente que é o objeto que é const e não seu atributo. Portanto, serei capaz de atualizar o id ou nome fazendo:
Mas, não poderei atualizar o próprio objeto como:
fonte
Porque em const você pode alterar os valores de um objeto, então o objeto não armazena realmente os dados de atribuição, mas em vez disso, aponta para eles. portanto, há uma diferença entre primitivos e objetos em Javascript.
fonte