Sobes.tech
Junior

De que formas é possível declarar variáveis em JavaScript? Nomeie as diferenças entre esses métodos.

sobes.tech IA

Resposta da IA

Em JavaScript, as variáveis podem ser declaradas de três formas: var, let, const.

Diferenças entre elas:

Diferença var let const
Escopo Funcional Bloco Bloco
Re-declaração Possível Possível Não possível
Reatribuição Possível Possível Não possível
Hoisting Eleva a declaração e a inicialização a undefined Eleva a declaração, mas não a inicialização Eleva a declaração, mas não a inicialização

Exemplos:

// var
function exemploVar() {
  var x = 10; // Escopo funcional
  if (true) {
    var x = 20; // Re-declaração possível dentro da mesma função
    console.log(x); // 20
  }
  console.log(x); // 20 (a variável x do if está acessível aqui)
}

console.log(x); // Erro: ReferenceError: x não está definido (x não é visível fora da função)

// Hoisting com var
console.log(a); // undefined
var a = 5;
console.log(a); // 5
// let
function exemploLet() {
  let y = 10; // Escopo de bloco
  if (true) {
    let y = 20; // Re-declaração não possível dentro do mesmo bloco
    console.log(y); // 20 (é outra variável y)
  }
  console.log(y); // 10 (a variável y fora do bloco)
}

console.log(y); // Erro: ReferenceError: y não está definido

// Hoisting com let
// console.log(b); // Erro: ReferenceError: Não é possível aceder a 'b' antes da inicialização
let b = 5;
console.log(b); // 5
// const
function exemploConst() {
  const z = 10; // Escopo de bloco
  // z = 20; // Erro: TypeError: Atribuição a variável constante. (Reatribuição não possível)
  if (true) {
    const z = 20; // Re-declaração não possível dentro do mesmo bloco
    console.log(z); // 20 (é outra variável z)
  }
  console.log(z); // 10 (a variável z fora do bloco)
}

console.log(z); // Erro: ReferenceError: z não está definido

// Hoisting com const
// console.log(c); // Erro: ReferenceError: Não é possível aceder a 'c' antes da inicialização
const c = 5;
console.log(c); // 5

// Para objetos e arrays declarados com const, é possível modificar o conteúdo
const obj = { name: 'Test' };
obj.name = 'Novo Test'; // Permitido
// obj = { name: 'Outro Test' }; // Erro