Sobes.tech
Junior

Qual é a diferença entre var, let e const?

sobes.tech IA

Resposta da IA

var tem um âmbito de função, enquanto que let e const têm um âmbito de bloco. var pode ser redeclarado e reatribuído, let pode ser reatribuído mas não redeclarado no mesmo escopo, e const não pode ser nem redeclarado nem reatribuído. Variáveis declaradas com var são elevadas (hoisting) com uma inicialização a undefined, enquanto let e const também são elevadas mas permanecem na "zona morta temporária" até à sua inicialização.

// var tem âmbito de função
function exemploVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (x é visível aqui)
}

// let e const têm âmbito de bloco
function exemploLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Erro ReferenceError: y não está definido
  // console.log(z); // Erro ReferenceError: z não está definido
}

// var pode ser redeclarado e reatribuído
var a = 1;
var a = 2; // Redeclaração
a = 3; // Reatribuição
console.log(a); // 3

// let pode ser reatribuído, mas não redeclarado no mesmo escopo
let b = 4;
// let b = 5; // Erro SyntaxError: identificador 'b' já foi declarado
b = 6; // Reatribuição
console.log(b); // 6

// const não pode ser reatribuído nem redeclarado
const c = 7;
// const c = 8; // Erro SyntaxError: identificador 'c' já foi declarado
// c = 9; // Erro TypeError: Atribuição a uma variável constante.
console.log(c); // 7 (para tipos primitivos)

// Elevação (hoisting)
console.log(hoistedVar); // undefined (var foi elevada e inicializada a undefined)
var hoistedVar = "Eu sou var";

// console.log(hoistedLet); // Erro ReferenceError: Não é possível aceder a 'hoistedLet' antes da inicialização
// let hoistedLet = "Eu sou let"; // Está na zona morta temporária

As diferenças principais resumem-se na tabela:

Característica var let const
Escopo Funcional De bloco De bloco
Redeclaração Sim Não (no mesmo escopo) Não
Reatribuição Sim Sim Não (para primitivos)
Elevação Sim (com undefined) Sim (zona morta temporária) Sim (zona morta temporária)
Inicialização precoce Não requer inicialização Não requer inicialização Requer inicialização

É importante notar que para objetos e arrays declarados com const, a variável em si não pode ser reatribuída a outro objeto/array, mas o conteúdo do objeto/array pode ser alterado.

const meuObjeto = { chave: 'valor' };
// meuObjeto = { novaChave: 'novaValor' }; // Erro TypeError: Atribuição a uma variável constante.
meuObjeto.chave = 'novaValor'; // Possível
console.log(meuObjeto); // { chave: 'novaValor' }

const meuArray = [1, 2];
// meuArray = [3, 4]; // Erro TypeError: Atribuição a uma variável constante.
meuArray.push(3); // Possível
console.log(meuArray); // [ 1, 2, 3 ]