A semântica var
elet
var
e let
são uma declaração para a máquina e para outros programadores:
Pretendo que o valor dessa atribuição mude ao longo da execução. Não confie no valor eventual desta tarefa.
Implicações do uso var
elet
var
e let
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 uma const
matriz referenciada e alterar chaves de propriedade em um const
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:
const Options = Object.freeze(['YES', 'NO'])
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
e let
é uma boa combinação
let
e var
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 forconst
.