Recentemente, encontrei a const
palavra - chave em JavaScript. Pelo que sei, ele é usado para criar variáveis imutáveis e testei para garantir que não possa ser redefinido (no Node.js.):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Percebo que ele ainda não está padronizado em todos os navegadores - mas estou interessado apenas no contexto do Node.js.8 e observei que certos desenvolvedores / projetos parecem favorecer bastante quando a var
palavra - chave pode ser usada para o mesmo efeito.
Então, minhas perguntas são:
- Quando é apropriado usar
const
no lugar devar
? - Deve ser usado toda vez que uma variável que não será redesignada for declarada?
- Realmente faz alguma diferença se
var
é usado no lugarconst
ou vice-versa?
Respostas:
Existem dois aspectos em suas perguntas: quais são os aspectos técnicos do uso em
const
vez devar
e quais são os aspectos relacionados ao ser humano.A diferença técnica é significativa. Em linguagens compiladas, uma constante será substituída no momento da compilação e seu uso permitirá outras otimizações, como a remoção do código morto, para aumentar ainda mais a eficiência do código em tempo de execução. Os mecanismos JavaScript recentes (termo pouco usado) compilam o código JS para obter melhor desempenho, portanto, o uso da palavra-chave const os informaria que as otimizações descritas acima são possíveis e devem ser feitas. Isso resulta em melhor desempenho.
O aspecto relacionado ao ser humano é sobre a semântica da palavra-chave. Uma variável é uma estrutura de dados que contém informações que se espera que sejam alteradas. Uma constante é uma estrutura de dados que contém informações que nunca serão alteradas. Se houver espaço para erro,
var
sempre deve ser usado. No entanto, nem todas as informações que nunca mudam na vida útil de um programa precisam ser declaradasconst
. Se, em diferentes circunstâncias, as informações mudarem, usevar
para indicar isso, mesmo que a alteração real não apareça no seu código.fonte
const
objetos parecem mutáveis, então não tenho certeza de quão rigoroso o compilador JS realmente é. Talvez o modo "use strict" faça a diferença também.const
apenas impede a reatribuição da "variável" para outro valor.const a = {}; a = {};
irá lançar um erro no modo estrito.If there is room for error, var should always be used
. Hoje isso não se aplica mais, com ferramentas como ESLint apontando imediatamente para aconst
violação.Atualização de 2017
Essa resposta ainda recebe muita atenção. Vale a pena notar que esta resposta foi postada no início de 2014 e muita coisa mudou desde então.ecmascript-6suporte agora é a norma. Todos os navegadores modernos agora suportam,
const
por isso deve ser bastante seguro de usar sem problemas.Resposta original de 2014
Apesar de ter um suporte de navegador bastante decente , evitaria usá-lo por enquanto. Do artigo da MDN em
const
:Em seguida, continua dizendo:
Se você usar,
const
precisará adicionar uma solução alternativa para oferecer suporte a navegadores um pouco mais antigos.fonte
Por que usar
const
, a resposta do @ Tibos é ótima.Mas você disse:
Isso está errado . Mutar uma variável é diferente de reatribuir:
Com const, você não pode fazer isso:
Mas você pode alterar sua variável:
Portanto, qualquer processo que altere o valor da variável sem usar o
=
sinal está modificando a variável.Nota:
+=
por exemplo é ... redesignando!Portanto, a linha inferior é:
const
não impede que você mude variáveis, impede que você as atribua novamente.fonte
=
sinal está desativado" está tecnicamente errado. Por exemplo,const marks=[92,83]; marks[2]=95; console.log(marks)
será exibido[92, 83, 95]
.marks
foi mutado, via sinal de igual.const
no contexto de matrizes (semelhante ao exemplo @chharvey usado). No caso deconst countArray = countup(n - 1); countArray.push(n);
oconst
é re-atribuído a cada vez. Então, por que usarconst
e nãovar
?const countArray
, nunca será reatribuído. Você ainda pode enviar para a matriz, que altera seus membros e comprimento, mas não chamamos isso de reatribuição. você usa emconst
vez delet
ouvar
quando deseja impedir a reatribuição. BTW, se você não quer permitir a reatribuição,let
é quase sempre melhor do quevar
.Para integrar as respostas anteriores, há uma vantagem óbvia em declarar variáveis constantes, além do motivo do desempenho: se você tentar alterá-las ou declará-las acidentalmente no código, o programa não alterará o valor ou emitirá um erro.
Por exemplo, compare:
com:
ou
com
fonte
const
não é imutável.Do MDN :
fonte
const
é imutável. Para objetos e matrizes, não é possível reatribuir, mas o conteúdo pode ser alterado (por exemplo, array.push).const
ou não, isso não afeta isso.var : declara uma variável, a inicialização de valor opcional.
let : Declara uma variável local com escopo de bloco.
const : declara uma constante nomeada somente leitura.
Ex:
fonte
Você tem ótimas respostas, mas vamos simplificar.
const
deve ser usado quando você tiver uma constante definida (leia-se: ela não será alterada durante a execução do programa).Por exemplo:
Se você acha que isso pode ser alterado em execução posterior, use a
var
.A diferença prática, baseada no exemplo, é que com
const
você sempre presumirá que pi será 3,14 [...], é um fato.Se você o definir como a
var
, pode ser 3,14 [...] ou não.Para uma resposta mais técnica, o @Tibos está academicamente certo.
fonte
Na minha experiência, uso const quando quero definir algo que talvez queira alterar mais tarde, sem precisar procurar o código procurando por bits que foram codificados permanentemente, por exemplo, um caminho de arquivo ou nome de servidor.
O erro no seu teste é outra coisa, você está tentando criar outra variável chamada x; esse seria um teste mais preciso.
fonte
Preferência pessoal realmente. Você pode usar const quando, como diz, não será reatribuído e é constante. Por exemplo, se você deseja atribuir seu aniversário. Seu aniversário nunca muda, então você pode usá-lo como uma constante. Mas sua idade muda, então isso pode ser uma variável.
fonte
Resumo:
const cria uma ligação imutável, o que significa que o identificador de variável const não é redesignável.
você não pode reatribuí-lo com
No entanto, se o identificador const possuir um objeto ou uma matriz, o valor dele poderá ser alterado na medida em que não o estivermos redesignando.
Observe que const é um escopo de bloco, assim como let, que não é o mesmo que var (que é de escopo de função)
Em resumo, quando algo provavelmente não mudar através da realocação, use const ou use let ou var, dependendo do escopo que você gostaria de ter.
É muito mais fácil raciocinar sobre o código quando está óbvio o que pode ser alterado através da nova atribuição e o que não pode ser. Mudar uma const para uma let é muito simples. E ficar const por padrão faz você pensar duas vezes antes de fazê-lo. E isso é, em muitos casos, uma coisa boa.
fonte
Ele fornece: 1) uma referência constante, por exemplo, const x = [] - a matriz pode ser modificada, mas x não pode apontar para outra matriz; e 2) escopo do bloco. const e let substituirão juntos var no ecma6 / 2015 Veja a discussão em https://strongloop.com/strongblog/es6-variable-declarations/
fonte
fonte
Primeiro, três coisas úteis sobre
const
(além das melhorias de escopo com as quais compartilhalet
):Suas perguntas:
Você pode fazer isso sempre que declarar uma variável cujo valor nunca muda. Se você considera apropriado é inteiramente da sua preferência / da sua equipe.
Isso depende de você / sua equipe.
Sim:
var
econst
tem regras de escopo diferentes. (Você pode querer comparar comlet
e nãovar
.) Especificamente:const
elet
têm escopo de bloco e, quando usados no escopo global, não criam propriedades no objeto global (mesmo que criem globais).var
possui escopo global (quando usado no escopo global) ou escopo de função (mesmo se usado em um bloco) e, quando usado no escopo global, cria uma propriedade no objeto global.fonte
A semântica
var
elet
var
elet
são uma declaração para a máquina e para outros programadores:Implicações do uso
var
elet
var
elet
forçar outros programadores a lerem todo o código intermediário da declaração para o uso eventual e raciocinarem sobre o valor da atribuição naquele ponto na execução do programa.Eles enfraquecem o raciocínio da máquina para que o ESLint e outros serviços de linguagem detectem corretamente nomes de variáveis digitados incorretamente em atribuições posteriores e reutilizam o escopo de nomes de variáveis de escopo externo onde o escopo interno esquece de declarar.
Eles também fazem com que os tempos de execução executem muitas iterações em todos os caminhos de código para detectar se são realmente constantes, antes que possam otimizá-los. Embora isso seja menos problemático do que a detecção de erros e a compreensibilidade do desenvolvedor.
Quando usar
const
Se o valor da referência não for alterado ao longo da execução, a sintaxe correta para expressar a intenção do programador é
const
. Para objetos, alterar o valor da referência significa apontar para outro objeto, pois a referência é imutável, mas o objeto não é.const
objetos " "Para referências a objetos, o ponteiro não pode ser alterado para outro objeto, mas o objeto criado e atribuído a uma
const
declaração é mutável. Você pode adicionar ou remover itens de umaconst
matriz referenciada e alterar chaves de propriedade em umconst
objeto referenciado.Para alcançar objetos imutáveis (que, novamente, facilitam o raciocínio de seu código para humanos e máquinas), você pode
Object.freeze
o objeto em declaração / atribuição / criação, como este:O Object.freeze afeta o desempenho, mas seu código provavelmente está lento por outros motivos. Você deseja criar um perfil.
Você também pode encapsular o objeto mutável em uma máquina de estado e retornar cópias profundas como valores (é assim que o estado Redux e React funcionam). Consulte Evitando o estado global mutável no JS do navegador para obter um exemplo de como construir isso a partir dos primeiros princípios.
Quando
var
elet
é uma boa combinaçãolet
evar
representam estado mutável. Eles devem, na minha opinião, ser usados apenas para modelar o estado mutável real . Coisas como " a conexão está viva? ".Elas são melhor encapsuladas em máquinas de estado testáveis que expõem valores constantes que representam " o estado atual da conexão ", que é uma constante a qualquer momento e em que o restante do seu código está realmente interessado.
A programação já é bastante difícil com a composição de efeitos colaterais e a transformação de dados. Transformar todas as funções em uma máquina de estados não testável, criando um estado mutável com variáveis apenas aumenta a complexidade.
Para uma explicação mais sutil, consulte Shun the Mutant - The case for
const
.fonte
'const' é uma indicação para o seu código de que o identificador não será reatribuído. Este é um bom artigo sobre quando usar 'const', 'let' ou 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao
fonte
Não sou especialista no negócio de compilação JS, mas faz sentido dizer que a v8 faz uso da flag const
Normalmente, depois de declarar e alterar um monte de variáveis, a memória fica fragmentada e a v8 pára para executar, faz uma pausa por alguns segundos, para fazer gc ou coleta de lixo.
se uma variável for declarada com const v8, pode-se confiar em colocá-la em um contêiner de tamanho fixo apertado entre outras variáveis const, pois nunca será alterada. Também pode salvar as operações adequadas para esses tipos de dados, pois o tipo não será alterado.
fonte
Quando se trata da decisão entre let e const , sempre prefira const para que o uso seja claro no código. Dessa forma, se você tentar redeclarar a variável, receberá um erro. Se não houver outra opção além de redeclará-la, basta alternar para deixar . Observe que, como Anthony diz, os valores não são imutáveis (por exemplo, um objeto const pode ter propriedades alteradas).
Quando se trata de var , como o ES6 foi lançado, nunca o usei no código de produção e não consigo pensar em um caso de uso para ele. No entanto, cuidado com o fato de que variáveis declaradas com var não possuem escopo de bloco.
fonte