← JavaScript: linguagem e diagnóstico de aplicações
01 / 10 · 45 MIN

Valores, conversões e contratos numéricos

Distingue tipo, conversão e validade; preserva zero, identidade textual e limites numéricos nas fronteiras da aplicação.

O valor tem tipo; a fronteira tem contrato

Uma variável JavaScript pode receber valores de tipos diferentes ao longo do tempo. Isso não significa que todas as operações tenham o mesmo comportamento para esses valores. Uma quantidade recebida como texto continua a ser texto até ser convertida. Antes de analisar um total, identifica a origem e o tipo de cada operando.

Este percurso usa a edição publicada ECMAScript 2026. As perguntas incidem em funcionalidades padronizadas e explicitam quando precisam de um ambiente de navegador. Não é necessário executar programas para responder. TypeScript e frameworks de interface são tratados nos percursos próprios; a existência de uma funcionalidade na norma não prova suporte em todos os motores antigos.

Conversão não é validação do campo

Considera um ficheiro em que a quantidade "6" é seguida de um incremento 2. A expressão "6" + 2 produz "62"; o operador escolhe concatenação quando encontra este operando string. Converter explicitamente pode resolver a soma, mas ainda falta saber se o formato de origem é permitido.

Number aceita string vazia ou só com espaços como zero. parseInt pode aceitar "28ms" como 28, ignorando o sufixo. Nenhum desses resultados demonstra que o campo cumpre um contrato de apenas dígitos. Preserva o texto até validar o formato completo e só depois impõe o intervalo numérico. Um valor convertido com sucesso pode continuar a ser inválido para a aplicação.

Ausência, falsidade e zero legítimo

Num painel de operações, zero pode significar que não se deve repetir uma chamada. Se o esquema já garante inteiro de 0 a 4 ou ausência, retryLimit || 2 altera essa decisão: zero é falsy e ativa o valor alternativo. retryLimit ?? 2 preserva zero e usa 2 apenas para null ou undefined.

Este operador não valida números nem texto. Se a origem ainda aceitar "false", a string é truthy por ser não vazia; Boolean não interpreta o seu significado linguístico. Define separadamente os valores de ausência e os valores válidos do domínio. Para uma opção textual true/false, rejeita outras strings e faz o mapeamento explícito depois da validação.

Igualdade e limites que importam ao dado

A igualdade estrita não converte "04" para o número 4. Esta regra ajuda a detetar diferenças de representação, mas não substitui uma decisão sobre identidade. Dois objetos distintos com propriedades iguais também não são automaticamente a mesma entidade. Define se comparas uma referência, uma chave ou conteúdo normalizado.

Para Number, Number.isFinite rejeita texto e valores não finitos sem conversão. Number.isNaN deteta especificamente NaN. Object.is distingue os zeros com sinal e considera NaN equivalente a NaN. Usa essas diferenças quando forem relevantes ao diagnóstico, sem transformar uma escolha de igualdade numa regra universal para todos os domínios.

Precisão e representação são decisões separadas

Um identificador como "9007199254740993" não deve passar por Number só porque contém dígitos. Fora dos inteiros seguros, valores inteiros diferentes podem deixar de ser distinguíveis. Converter o resultado arredondado de volta para string não recupera informação. Se a chave é textual, validar e conservar o texto costuma corresponder ao contrato.

BigInt permite aritmética inteira exata, mas a sua representação decimal também não conserva zeros iniciais significativos. Além disso, 5n + 2 mistura tipos numéricos e lança TypeError; seria necessária uma escolha explícita e justificada do domínio. Para quantidades Number, Number.isSafeInteger verifica se o valor é inteiro e respeita o limite de segurança, mas o intervalo específico da aplicação continua a ter de ser imposto.

Leitura guiada de uma fronteira de importação

O programa apresentado aceita apenas strings não vazias de dígitos ASCII e quantidades até 5000. A primeira condição rejeita outros tipos, vazio e qualquer carácter fora desse conjunto, incluindo uma quebra de linha no fim. Só depois é feita a conversão e verificada a quantidade. A função devolve um objeto de resultado; não grava dados nem altera stock.

Por leitura, "0007" é aceite com value igual a 7 e "0" com value igual a 0. "28ms", "1e3" e "" falham no formato. "5001" tem formato aceite, mas falha no intervalo. Uma cadeia muito longa de dígitos pode produzir um Number não seguro ou infinito e é rejeitada na segunda condição. O chamador deve consultar ok antes de usar value.

Decisão e evidência de aceitação

Ao rever o importador, separa três perguntas: a forma recebida pertence ao contrato, a conversão conserva a informação necessária e o valor convertido cabe no domínio? Uma correção que apenas troca parseInt por Number ainda pode aceitar espaços, expoentes ou outras formas proibidas. Uma correção que usa truthiness pode eliminar o zero permitido.

Para justificar a decisão, acompanha uma entrada válida, zero, ausência, sufixo inválido e excesso de intervalo até ao resultado. Explica em que condição cada uma é aceite ou rejeitada. Nas perguntas desta aula fazes essa análise por escolha única ou múltipla; não precisas de instalar ferramentas nem de executar os excertos.

function readQuantity(raw) {
  if (typeof raw !== "string" || raw.length === 0 || /[^0-9]/.test(raw)) {
    return { ok: false, reason: "invalid-format" };
  }
  const value = Number(raw);
  if (!Number.isSafeInteger(value) || value < 0 || value > 5000) {
    return { ok: false, reason: "out-of-range" };
  }
  return { ok: true, value };
}
NA PRÁTICA

Lê o exemplo sem executar. A expressão regular procura qualquer carácter que não seja um dígito ASCII; não valida só um prefixo. O resultado separa aceitação de quantidade, pelo que zero não funciona como sinal de erro.

Armadilhas comuns

Usar + com texto e esperar soma; usar || para preservar zero; aceitar prefixos de parseInt; tratar qualquer Number como inteiro seguro; converter identificadores textuais.

Tópicos relacionados: Variáveis, funções e closures · JSON, texto e contratos de tempo · Erros, validação e contratos de falha

Leva esta ideia contigo

Define primeiro o contrato de entrada. Converte apenas depois de decidir que informação pode ser perdida.

Criar conta

Referência: Grammar and types · ECMAScript 2026 (17th edition); browser APIs identified separately