Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Variável e tipo de dado: o que o programa guarda

Variável como etiqueta e não como caixa: nome, valor e tipo, com a diferença entre número, texto e booleano aparecendo na saída do Node.

Rodolfo Mori4 min de leitura

Variável é um nome que aponta para um valor durante a execução; tipo de dado descreve quais operações fazem sentido para esse valor. Nome, valor e tipo formam o estado que seu algoritmo transforma.

O domínio será o saldo de uma conta de cursos. A entrada informa créditos e compras, o processamento atualiza o saldo e a saída mostra o estado. Se essa divisão ainda estiver nova, revise entrada, processamento e saída.

A etiqueta e o conteúdo

Pense numa etiqueta colada num compartimento: saldo é a etiqueta e 1500 é o conteúdo encontrado por esse nome. A analogia termina aí. O JavaScript não promete uma caixinha física por variável, e objetos podem compartilhar referências ao mesmo valor.

js
let saldo = 1500;
console.log('nome: saldo');
console.log('valor:', saldo);
console.log('tipo:', typeof saldo);
nome: saldo valor: 1500 tipo: number

typeof permite observar o tipo em tempo de execução. Ele é útil para diagnóstico, mas não substitui um contrato de entrada: descobrir tarde que um preço virou texto ainda deixa o erro acontecer.

Dar nome é decidir o papel do dado

x obriga quem lê a reconstruir o contexto. saldoEmCentavos declara conteúdo e unidade. Compare o efeito no mesmo cálculo:

js
const saldoEmCentavos = 150000;
const compraEmCentavos = 2490;
const saldoFinalEmCentavos = saldoEmCentavos - compraEmCentavos;

console.log(saldoFinalEmCentavos);
147510

O nome não muda o resultado do Node, mas reduz decisões escondidas. Se parte do sistema usa reais e outra usa centavos, o nome impede uma soma tecnicamente válida e comercialmente errada.

Atribuição não é igualdade

Em matemática, = afirma igualdade. Em programação, a atribuição lê o valor da direita e o associa ao nome da esquerda. A nova atribuição substitui a anterior:

js
let saldo = 100;
saldo = saldo + 40;
saldo = saldo - 15;

console.log(saldo);
125

Na linha saldo = saldo + 40, o lado direito usa o valor antigo, calcula 140 e só então atualiza o nome. Ler da direita para a esquerda elimina a aparente contradição “saldo é igual a saldo mais quarenta”.

Número, texto e booleano resolvem o começo

Número representa quantidades; string representa texto; booleano representa uma condição com dois estados. As aspas fazem parte da decisão de tipo:

js
const preco = 29.9;
const curso = 'Lógica';
const pagamentoConfirmado = false;

console.log(typeof preco, preco);
console.log(typeof curso, curso);
console.log(typeof pagamentoConfirmado, pagamentoConfirmado);
number 29.9 string Lógica boolean false

Um CEP parece número, mas você não soma CEPs e precisa preservar zero inicial; portanto ele é texto. O tipo nasce do uso, não da aparência.

O tipo decide o que o operador faz

O operador + soma números e concatena strings. Uma mudança invisível de tipo muda o algoritmo:

js
console.log(2 + 2);
console.log('2' + '2');
console.log('2' + 2);
4 22 22

Esse é o erro clássico de formulário: campos chegam como texto. Somar sem converter produz um resultado que parece número, mas é junção de caracteres.

Rastreando saldo ao longo de sete atribuições

A tabela foi preenchida acompanhando o estado depois de cada operação e confirmada pelo Node:

js
let saldo = 1000;
const operacoes = [
  ['depósito', 500],
  ['compra', -200],
  ['bônus', 50],
  ['mensalidade', -100],
  ['estorno', 200],
  ['taxa', -20],
];

console.log('inicial', typeof saldo, saldo);
for (const [nome, valor] of operacoes) {
  saldo = saldo + valor;
  console.log(nome, typeof saldo, saldo);
}
inicial number 1000 depósito number 1500 compra number 1300 bônus number 1350 mensalidade number 1250 estorno number 1450 taxa number 1430
passo operação tipo depois saldo depois
1 inicial number 1000
2 depósito number 1500
3 compra number 1300
4 bônus number 1350
5 mensalidade number 1250
6 estorno number 1450
7 taxa number 1430

O teste de mesa formaliza essa leitura. Uma linha por mudança permite localizar o primeiro ponto em que o estado diverge do esperado.

A linha em que o saldo vira texto

Agora uma entrada chega como '200'. O operador troca de soma para concatenação:

js
let saldo = 1500;
const depositoDigitado = '200';

saldo = saldo + depositoDigitado;
console.log(typeof saldo, saldo);
saldo = saldo - 100;
console.log(typeof saldo, saldo);
string 1500200 number 1500100

O segundo passo volta a número porque - não concatena e força conversão. Isso não corrige o saldo: agora existe um número absurdo. O primeiro estado errado foi 1500200, então é ali que a investigação começa.

Converta e valide na entrada:

js
const saldo = 1500;
const depositoDigitado = '200';
const deposito = Number(depositoDigitado);

if (!Number.isFinite(deposito)) throw new TypeError('Depósito inválido');
console.log(saldo + deposito);
1700

Const protege a associação, não congela tudo

Reatribuir uma constante produz um erro real. Capturamos a mensagem para manter o exemplo legível:

js
const limite = 3;

try {
  limite = 4;
} catch (erro) {
  console.log(`${erro.name}: ${erro.message}`);
}
TypeError: Assignment to constant variable.

Use const por padrão porque ele reduz as linhas capazes de trocar a associação. Use let para contador, acumulador e estado que realmente evolui. Não use var no código novo de iniciante; seu escopo e içamento adicionam regras sem benefício aqui.

Missão: modelar um boletim escolar

Liste nome do aluno, três notas, quantidade de faltas e situação de aprovação. Para cada variável, anote nome, exemplo de valor, tipo e motivo. Depois execute uma amostra:

js
const aluno = 'Rafaela';
const notas = [8, 7.5, 9];
const faltas = 3;
const media = notas.reduce((soma, nota) => soma + nota, 0) / notas.length;
const aprovado = media >= 7 && faltas <= 10;

console.log({ aluno, media, faltas, aprovado });
{ aluno: 'Rafaela', media: 8.166666666666666, faltas: 3, aprovado: true }

Revise o modelo procurando três cheiros. Primeiro, nomes sem unidade, como tempo, quando segundos e minutos podem se misturar. Segundo, sentinelas mágicas, como usar -1 para significar ausente sem documentar o contrato. Terceiro, booleanos com negação no nome, que produzem leituras como “não não está bloqueado”. Corrija o vocabulário antes de adicionar mais condições.

Também distinga estado derivado de estado fonte. media pode ser calculada a partir de notas; se você guarda os dois e altera apenas um, eles divergem. Calcule valores derivados no ponto de uso ou atualize-os por uma única função. Menos estados independentes significam menos combinações inválidas para rastrear.

No boletim, registre ainda o contrato de ausência. Nota não lançada não é zero, porque zero é uma nota possível. Use uma representação que obrigue o processamento a decidir antes de calcular. Essa escolha evita uma média tecnicamente válida construída com dado que ainda não existe.

O critério de sucesso é justificar o tipo pelo uso, não pelo conteúdo aparente. Em seguida, estude operadores e expressões para prever como esses valores se combinam, consulte o mapa do guia de lógica e continue pela trilha de Lógica.

  • variavel
  • tipo de dado
  • booleano
  • atribuicao
  • typeof

Perguntas frequentes

Variável em JavaScript pode mudar de tipo?
Uma variável declarada com let pode receber valores de tipos diferentes. Isso é permitido, mas uma troca acidental costuma indicar entrada sem conversão ou contrato mal definido.
Quando usar const em vez de let?
Use const quando o identificador não será reatribuído e let quando a própria referência precisa mudar. Objetos const ainda podem ter propriedades alteradas.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Node v26.3.0, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. ECMAScript — Language Types — tc39.es
  2. ECMAScript — The typeof Operator — tc39.es

Continue por aqui