Dados como matéria-prima do software

Programas existem para transformar dados: ler entrada, aplicar regras, produzir saída. Antes de frameworks e bancos de dados, domine como sua linguagem representa informação na memória — tipos primitivos, coleções, objetos e o comportamento de referências.

Variáveis e constantes

Variável é um nome simbólico para um valor armazenado. Constante (const) impede reatribuição do nome; o conteúdo referenciado pode ser mutável se for objeto ou array.

const ANO_FISCAL = 2026;
let saldoConta = 1200.50;

saldoConta += 300;
// ANO_FISCAL = 2027; // erro: reatribuição proibida

Tipos primitivos em JavaScript

TipoExemploObservação
number42, 3.14IEEE 754; cuidado com centavos em finanças
string'SP', `Olá ${nome}`Template literals facilitam interpolação
booleantrue, falseResultado de comparações
nullnullAusência intencional
undefinedundefinedVariável não inicializada ou propriedade inexistente

Escopo: onde o nome é visível

const empresa = 'Dev Journal';

function calcularBonus(funcionario) {
  const taxa = 0.08; // local à função
  return funcionario.salario * taxa;
}

{
  let rascunho = 'notas da reunião';
}
// rascunho não existe aqui — ReferenceError se acessado
Diagrama PlantUML

Arrays: listas ordenadas

const notas = [7.5, 8.0, 6.5, 9.0];

const aprovados = notas.filter(n => n >= 7);
const media = notas.reduce((acc, n) => acc + n, 0) / notas.length;

console.log({ aprovados, media });

Métodos map, filter, reduce expressam transformações sem loops manuais — padrão comum em código profissional moderno.

Objetos: registros com campos nomeados

const cliente = {
  id: 'C-1024',
  nome: 'Ana Costa',
  plano: 'premium',
  pedidos: [
    { id: 1, total: 320.50 },
    { id: 2, total: 89.00 }
  ]
};

const totalPedidos = cliente.pedidos.reduce((s, p) => s + p.total, 0);

Referência vs cópia

Objetos e arrays são atribuídos por referência — duas variáveis podem apontar para o mesmo endereço na memória:

const original = { itens: [1, 2] };
const copiaSuperficial = { ...original };

copiaSuperficial.itens.push(3);
console.log(original.itens.length); // 3 — array interno compartilhado

const copiaProfunda = structuredClone(original);
copiaProfunda.itens.push(99);
console.log(original.itens.length); // ainda 3

Em fluxos críticos (edição de formulários, estado de UI), entender essa diferença evita bugs “fantasma” difíceis de reproduzir.

Finanças e ponto flutuante

0.1 + 0.2 === 0.3 é false em JavaScript. Para valores monetários, armazene centavos como inteiros ou use biblioteca decimal — padrão em sistemas de pagamento.

function reaisParaCentavos(valor) {
  return Math.round(valor * 100);
}

function centavosParaReais(centavos) {
  return centavos / 100;
}

Modelagem mínima de domínio

Antes de classes e ORM, pratique agrupar dados relacionados:

function criarPedido(id, itens) {
  const subtotal = itens.reduce((s, i) => s + i.preco * i.qtd, 0);

  return {
    id,
    itens: structuredClone(itens),
    subtotal,
    criadoEm: new Date().toISOString()
  };
}

Exercícios recomendados

  1. Array de transações: filtrar créditos, somar total, encontrar maior valor.
  2. Objeto funcionário com dependentes: calcular desconto de plano de saúde por faixa etária.
  3. Detectar quando mutação acidental altera objeto global — corrigir com clone.

Memória: onde os dados “moram” enquanto rodam

Quando você declara const cliente = { nome: 'Ana' }, o objeto vive na RAM do processo Node ou do navegador. Encerrou o processo, variáveis locais somem — por isso persistimos em disco (arquivo, banco) ou localStorage na web. Conectar este post ao de Como um computador funciona ajuda a entender por que copiar objeto errado gera bug “fantasma”.

Para aprofundar na web

Para entender melhor este tema, pesquise por:

  • "tipos primitivos JavaScript MDN" — referência oficial de number, string, boolean
  • "passagem por referência vs valor JavaScript" — mutação acidental em objetos
  • "structuredClone vs spread JavaScript" — quando copiar profundamente
  • "IEEE 754 ponto flutuante explicado" — por que centavos exigem cuidado
  • "escopo variável JavaScript let const" — visibilidade e blocos

Pratique no console do navegador (F12) antes de scripts longos — feedback imediato.

Atividades

  1. Por que 0.1 + 0.2 !== 0.3 em JavaScript?

    • A) Bug do Node.js
    • B) Limitação de representação binária de ponto flutuante
    • C) Porque const impede soma
    • D) Porque arrays são imutáveis
    Ver resposta

    Resposta correta: B) Limitação de representação binária de ponto flutuante

    Números IEEE 754 não representam todas as frações decimais com exatidão; use inteiros de centavos ou biblioteca decimal em finanças.

  2. spread {...obj} cria:

    • A) Cópia profunda garantida de todos os níveis
    • B) Cópia rasa: propriedades de primeiro nível duplicadas, aninhados por referência
    • C) Referência idêntica sem clone
    • D) Impossibilidade de clonar objetos
    Ver resposta

    Resposta correta: B) Cópia rasa: propriedades de primeiro nível duplicadas, aninhados por referência

    Spread clona primeiro nível; arrays/objetos internos ainda podem ser compartilhados — use structuredClone para profundidade.

  3. undefined difere de null porque:

    • A) undefined é erro de sintaxe
    • B) null é ausência intencional; undefined costuma indicar não inicializado ou ausente
    • C) null só existe em Python
    • D) São idênticos em comparação estrita
    Ver resposta

    Resposta correta: B) null é ausência intencional; undefined costuma indicar não inicializado ou ausente

    === distingue null e undefined; APIs usam null para 'sem valor' explícito.

  4. Dado um array de pedidos com campo total, descreva os passos para obter o total geral sem modificar o array original.

    Ver resposta

    Usar reduce somando pedido.total com acumulador inicial 0, ou for...of acumulando em variável separada; não usar push/pop no array fonte; opcionalmente validar totais numéricos antes da soma.