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 };
}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
Define primeiro o contrato de entrada. Converte apenas depois de decidir que informação pode ser perdida.
Referência: Grammar and types · ECMAScript 2026 (17th edition); browser APIs identified separately