O que significa o “const” em ES6?

Se você veio de uma linguagem de programação do tipo C, pode estar se perguntando porquê o código JavaScript abaixo é válido mas o segundo, em C (como você deve saber) vai dar erro de compilação?

# JavaScript
const numbers = [1, 2, 3, 4, 6]
numbers[4] = 5
console.log(numbers[4]) // exibe 5
# C
const int numbers[] = {1, 2, 3, 4, 6};
numbers[4] = 5; // erro: variável é somente-leitura
printf("%d\n", numbers[4]);

O motivo disto é porque o const em C define uma variável somente leitura, ou seja, não modificável enquanto em JavaScript não se trata de imutabilidade de valor. Não indica que o valor é uma constante ou somente leitura. Em vez disso, ela cria a associação imutável (immutable binding) e garante que nenhuma reassociação será realizada. Com isto dito, o seguinte código levantará um erro em tempo de exeução.

const numbers = [1, 2, 3, 4, 6]
numbers = [7, 8, 9, 10, 11] // erro: associação a uma constante
console.log(numbers[4])

Para entender o conceito melhor, examinemos a seguinte imagem onde a relação entre o nome da variável (identificador), seu valor e seu endereçamento de memória é explicada:

Variáveis e alocação de memória.

Como podemos ver, um identificador se refere a uma área de memória através de um endereço ao qual o valor associado à variável é guardado. Neste cenário podemos reconhecer que enquanto a associação na variável imutável não permite que você reassocie um nome de variável a um endereço de memória diferente, permite que você modifique o valor dentro da célula de memória associada a um identificador. Inversamente, uma variável somente leitura ou imutável não permite alteração do valor.

Como tornar um valor imutável?

Tipos de dados primitivos são sempre imutáveis por natureza. Os seguintes exemplos intuitivamente explicam o porquê.
# Exemplo 1
const a = 10
a = a + 1 // erro: associação a uma constante
# Exemplo 2
const isTrue = true
isTrue = false // erro: associação a uma constante
# Exemplo 3
const sLower = 'hello world'
const sUpper = sLower.toUpperCase() // cria uma nova string
console.log(sLower) // exibe hello world
console.log(sUpper) // exibe HELLO WORLD

Para tornar um objeto imutável, você pode usar Object.freeze(). Porém isso só funciona em objetos tipo chave-valor o que significa que não funciona com outros objetos tipo Date, Map e Set.

# Exemplo 4
const me = Object.freeze({name: “André”})
me.age = 42
console.log(me.age) // exibe undefined
# Exemplo 5
const arr = Object.freeze([-1, 1, 2, 3])
arr[0] = 0
console.log(arr[0]) // exibe -1
# Exemplo 6
const me = Object.freeze({
  name: 'André', 
  pet: {
    type: 'cat',
    name: 'Simba'
  }
})
me.pet.name = 'Lala'
me.pet.breed = 'Mixed'
console.log(me.pet.name) // exibe Lala
console.log(me.pet.breed) // print Mixed

Como visto no último exemplo, objetos aninhados dentro de um objeto “congelado” podem ser alterados. Para tornar valores do objeto totalmente imutável, você deve utilizar um método customizado tipo deepFreeze(). Outra opção é utilizar a biblioteca Immutable.js que não somente torna objetos imutáveis como também provê diversas estruturas de dados imutáveis incluindo List, Stack, Map, OrderedMap, Set, OrderedSet e Record.

var, let ou const?

No ES6, não devemos jamais utilizar o “var” para definir uma variável ou constante. O fato é que hoje isso é a pior prática disponível ao se definir uma variável em JavaScript.

Uma variável bem definida não deve ser utilizada para representar múltiplos conceitos. Isto garante um código limpo e legível. Já que o const no JavaScript indica que a variável não pode ser reassociada, é preferível utilizar const para todas as variáveis do programa que não devam ser alteradas. Entretanto, quando as variáveis precisam ser alteradas, devemos utilizar let. Geralmente utilizado em contadores de loops ou variáveis de troca em subrotinas.

Recapitulando

Se você usa o ES6, utilize const por padrão, nunca utilize o var e sempre utilize o let quando houver necessidade de reatribuição.

Fonte: https://medium.com/the-node-js-collection/what-does-const-stand-for-in-es6-f7ab3d9e06fc

Espero que este artigo tenha sido útil para você!

Se houver alguma dúvida, sugestão ou percebeu algum erro de digitação, não hesite em entrar em contato que responderei tão rápido quanto puder e atribuirei o crédito pela ajuda.

Até mais!
André Fellows

Leave a Reply Cancel reply