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 ]