Eu tenho escrito muito código ES6 para io.js recentemente. Não há muito código na natureza para aprender, por isso sinto que estou definindo minhas próprias convenções à medida que avanço.
A minha pergunta é sobre quando usar const
vs let
.
Eu tenho aplicado esta regra: Se possível, use const
. Use apenas let
se você souber que seu valor precisa mudar. (Você sempre pode voltar e alterar a const
para a let
se, posteriormente, for necessário alterar seu valor.)
O principal motivo dessa regra é que é fácil aplicar de forma consistente. Não há áreas cinzentas.
O fato é que, quando aplico essa regra, na prática 95% das minhas declarações são const
. E isso me parece estranho. Só estou usando let
para coisas como i
um for
loop ou ocasionalmente para coisas como totais acumulados de Fibonacci (que não surgem muito na vida real). Fiquei surpreso com isso - verifica-se que 95% das 'variáveis' no meu código ES5 até agora eram de valores que não variam. Mas ver const
todo o meu código parece errado de alguma forma.
Então, minha pergunta é: está tudo bem em usar const
tanto? Eu realmente deveria estar fazendo coisas assim const foo = function () {...};
?
Ou devo reservar const
para esse tipo de situação em que você está codificando um literal na parte superior de um módulo - o que você faz em maiúsculas, como const MARGIN_WIDTH = 410;
?
fonte
const
isso tanto.function foo() {...}
é melhor do que<anything> foo = function() {...}
function foo() {...}
pode causar pequenas confusões durante a depuração, devido à elevação. Além disso, sua existência significa que temos duas construções que fazem a mesma coisa, mas uma delas funciona apenas em um contexto muito específico. (Você pode usar uma expressão de função em qualquer lugar em que uma expressão possa existir, mas você só pode usar uma declaração de função no nível da instrução.) Se você favorecer a brevidade, o problema pode ser apenas o fato de a sintaxe da expressão de função usar a palavra inteirafunction
.Respostas:
Minha resposta aqui não é específica para javascript.
Como regra geral, em qualquer idioma que me permita fazê-lo de maneira semi-fácil, eu diria que sempre use const / final / readonly / o que for chamado no seu idioma sempre que possível. O motivo é simples, é muito mais fácil argumentar sobre o código quando é óbvio o que pode mudar e o que não pode mudar. Além disso, em muitos idiomas, você pode obter suporte para ferramentas que informam que você está fazendo algo errado quando atribui acidentalmente a uma variável que declarou como const.
Voltar e alterar 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.
Quantos bugs você já viu que variáveis envolvidas mudavam inesperadamente? Eu acho que muito. Eu sei que a maioria dos erros que eu vejo envolvem mudanças inesperadas de estado. Você não se livrará de todos esses bugs usando liberalmente const, mas se livrará de muitos deles!
Além disso, muitas linguagens funcionais têm variáveis imutáveis, onde todas as variáveis são const por padrão. Veja Erlang, por exemplo, ou F #. A codificação sem atribuição funciona perfeitamente nessas linguagens e é uma das muitas razões pelas quais as pessoas adoram a programação funcional. Há muito a aprender com essas linguagens sobre como gerenciar o estado para se tornar um programador melhor.
E tudo começa com ser extremamente liberal com const! ;) São apenas mais dois personagens para escrever em comparação com let, então vá em frente e
const
todas as coisas!fonte
const
é mais do que dois personagenslet
...val
no Scala (que declara uma variável como imutável) e somente usandovar
(o equivalente mutável) quando não podemos usarval
. Em outras palavras, declaramos variáveis como imutáveis por padrão e só introduzimos mutabilidade quando absolutamente precisamos delas (o que pode ser simplesmente porque a abordagem mutável é mais limpa).Tenha cuidado, porque as
const
chaves do objeto são mutáveis.A partir daqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
considere este exemplo:
A mesma coisa para matrizes:
Eu ainda não decidi totalmente, mas estou pensando em usar
const
para todos os não-array / não-objetos e usarlet
para objetos / matrizes.fonte
const
.colors = numbers
não funcionará, como esperado. Se você deseja proteger as propriedades do seu objeto, você pode usarObject.freeze()
developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…const moment = require('moment')
, a menos que você seja o tipo de pessoa que está preocupada com o que alguém tentará fazermoment = dead.fish(() => pizza)
mais tarde.moment = Date.now()
. Mas, em qualquer caso, se o código assume uma invariante, não vejo nada de errado em aplicá-lo sempre que possível.Não se preocupe com isso.
const
é uma adição incrível ao JavaScript, e eu recomendo que você o use em todos os lugares em que faz sentido. Torna o código mais robusto.Quando se trata de objetos,
const
protegerá sua variável da reatribuição, mas se você precisar de objetos imutáveis, precisará doObject.freeze
método, veja abaixo.const
protegerá apenas da reatribuição e ofreeze
método protegerá todas as propriedades imediatas. Se você precisar que todas as propriedades aninhadas também sejam imutáveis, precisará recursivamentefreeze
elas.fonte
Object.freeze
é superficial.No meu ES6
const
não se trata de post de imutabilidade , explico o queconst
significa exatamente de acordo com as especificações.Com base nesses fatos objetivos, aqui está minha preferência pessoal:
Por mais subjetivo que seja, é um fato que isso se aproxima mais da intenção da especificação.
As pessoas que usam
let
por padrão geralmente tratamconst
variáveis como constantes (o que não são necessariamente por design!). Cada um na sua, mas prefiro usar as coisas para o propósito pretendido, e não para algum significado inventado que as pessoas atribuem a ela com base em um mal-entendido.Usar
const
apenas para constantes é como usar o<aside>
elemento HTML apenas para o conteúdo da barra lateral.fonte
const
se não é constante?const
é para isso. Você leu o texto acima?const
É que ele é chamadoconst
. É um nome idiota (em javascript) que confunde muitos desenvolvedores (todos?) Primeiro. A IMO seria melhor se tivesseconst
sido chamadolet
(especialmente porquelet
é mais curto, masconst
é muito mais comum) elet
chamado de outra coisa.Minha abordagem pessoal, pensada para ajudar na legibilidade e compreensão do código:
let
é apenas para variáveis de vida curta, definidas em uma única linha e não alteradas depois. Geralmente aquelas variáveis que existem apenas para diminuir a quantidade de digitação. Por exemplo:const
para todos os nomes conhecidos por serem constantes em todo o módulo. Não incluindo valores constantes locais. Ovalue
exemplo acima, por exemplo, é constante em seu escopo e pode ser declarado comconst
, mas como existem muitas iterações e para cada uma existe um valor com o mesmo nome , "valor", que pode induzir o leitor a pensar quevalue
é sempre o mesmo. Módulos e funções são o melhor exemplo deconst
variáveis:var
por tudo que pode ou não ser variável. Os nomes que podem confundir as pessoas que leem o código, mesmo que sejam constantes localmente e não sejam adequados paralet
(ou seja, não foram preenchidos em uma simples declaração direta), são solicitados para serem declarados comvar
. Por exemplo:Comentários adicionais e possíveis atualizações futuras aqui .
fonte
O JavaScript é um pouco especial, pois as variáveis podem ser funções e outras, mas considere em C #, Java ou outra linguagem semelhante ao estilo C:
A
const
é estranho, e isso é porque o método declarações em línguas não pode mudar, uma vez que está compilada em outra coisa, que é o que eles fazem, não importa o que (ignorando alguns hacks terríveis que podem existir).Por que o JavaScript deve ser diferente? Portanto, não é compilado, mas isso não significa que devemos jogar fora a segurança que os compiladores podem fornecer. O uso da
const
palavra - chave nos dá mais segurança, o que certamente levará a aplicações mais robustas.fonte