Como validar um CPF com JavaScript
Escrito por: Thiago Nunes Batista
Publicado em: 17/09/2026
Última atualização: 17/09/2026
Validar CPF no front-end ajuda a evitar erros em formulários de cadastro, checkout e login. No back-end, a validação é uma segunda barreira contra dados digitados incorretamente e fraudes mais básicas.
Neste artigo, você vai entender o algoritmo do CPF e implementar uma função de validação de CPF em JavaScript puro, sem biblioteca externa.
O que são os dígitos verificadores
Um CPF tem 11 dígitos:
- Os 9 primeiros são a base do documento.
- Os 2 últimos são os dígitos verificadores.
Esses dois dígitos são calculados a partir dos anteriores. A ideia é detectar erros comuns de digitação, como trocar ou remover um número.
A validação matemática, porém, não confirma se o CPF existe, pertence a determinada pessoa ou está regular na Receita Federal. Ela apenas verifica se os dígitos obedecem ao algoritmo do CPF.
Primeiro dígito verificador
Considere o CPF sem formatação:
52998224725
Os 9 primeiros dígitos são:
5 2 9 9 8 2 2 4 7
Multiplicamos cada número pelos pesos de 10 a 2:
5×10 + 2×9 + 9×8 + 9×7 + 8×6 + 2×5 + 2×4 + 4×3 + 7×2
O resultado é:
50 + 18 + 72 + 63 + 48 + 10 + 8 + 12 + 14 = 295
Agora calculamos o resto da divisão por 11:
295 % 11 = 9
Como o resto é maior que 1, fazemos:
11 - 9 = 2
Portanto, o primeiro dígito verificador é 2.
Segundo dígito verificador
Agora usamos os 10 primeiros dígitos, incluindo o verificador calculado:
5 2 9 9 8 2 2 4 7 2
Aplicamos os pesos de 11 a 2:
5×11 + 2×10 + 9×9 + 9×8 + 8×7 + 2×6 + 2×5 + 4×4 + 7×3 + 2×2
A soma fica:
55 + 20 + 81 + 72 + 56 + 12 + 10 + 16 + 21 + 4 = 347
O resto da divisão por 11 é:
347 % 11 = 6
Como o resto é maior que 1:
11 - 6 = 5
O segundo dígito verificador é 5. Assim, o CPF completo é:
52998224725
Esse é o algoritmo do CPF: calcular o primeiro dígito, incorporá-lo à sequência e calcular o segundo.
Implementação em JavaScript puro
A função precisa lidar com entradas formatadas, como 529.982.247-25, e também com uma sequência de números sem pontuação.
Uma implementação possível é esta:
function validarCPF(cpf) {
// Garante que a entrada seja tratada como texto
cpf = String(cpf).replace(/\D/g, "");
// Um CPF válido deve ter exatamente 11 dígitos
if (cpf.length !== 11) {
return false;
}
// Rejeita CPFs formados pelo mesmo dígito
if (/^(\d)\1{10}$/.test(cpf)) {
return false;
}
// Calcula o primeiro dígito verificador
let soma = 0;
for (let i = 0; i < 9; i++) {
soma += Number(cpf[i]) * (10 - i);
}
let resto = soma % 11;
const primeiroDigito = resto < 2 ? 0 : 11 - resto;
// O primeiro dígito calculado deve ser igual ao informado
if (primeiroDigito !== Number(cpf[9])) {
return false;
}
// Calcula o segundo dígito verificador
soma = 0;
for (let i = 0; i < 10; i++) {
soma += Number(cpf[i]) * (11 - i);
}
resto = soma % 11;
const segundoDigito = resto < 2 ? 0 : 11 - resto;
// O segundo dígito calculado também deve ser igual ao informado
return segundoDigito === Number(cpf[10]);
}
Exemplos de uso:
console.log(validarCPF("529.982.247-25"));
// true
console.log(validarCPF("52998224725"));
// true
console.log(validarCPF("529.982.247-26"));
// false
console.log(validarCPF("111.111.111-11"));
// false
O trecho replace(/\D/g, '') remove tudo que não for dígito. Isso permite aceitar tanto 529.982.247-25 quanto 52998224725.
A expressão regular usada para dígitos repetidos merece atenção:
/^(\d)\1{10}$/;
Ela identifica uma sequência de 11 caracteres formada pelo mesmo dígito. Isso impede que valores como 111.111.111-11 sejam aceitos.
Esse é um detalhe que costuma pegar quem já bateu cabeça com o problema: CPFs com todos os dígitos iguais passam pela conta matemática, mas devem ser rejeitados explicitamente. Se você implementar apenas os cálculos, 11111111111 será considerado válido pelo seu código.
Se quiser testar entradas rapidamente sem criar um formulário, use nosso validador de CPF online, gratuito.
Validação no formulário
Você pode chamar a função no evento de envio do formulário:
const formulario = document.querySelector("#formulario");
const campoCPF = document.querySelector("#cpf");
const mensagem = document.querySelector("#mensagem");
formulario.addEventListener("submit", function (evento) {
evento.preventDefault();
if (!validarCPF(campoCPF.value)) {
mensagem.textContent = "Informe um CPF válido.";
return;
}
mensagem.textContent = "CPF válido.";
});
Essa validação melhora a experiência no navegador, mas não substitui a validação no servidor. Qualquer código executado no front-end pode ser alterado ou ignorado pelo cliente. O back-end deve repetir a validação antes de salvar ou processar o dado.
Erros comuns
Validar CPF só com regex de formato
Uma expressão como esta:
/^\d{3}\.\d{3}\.\d{3}-\d{2}$/;
verifica apenas se o texto tem o formato 000.000.000-00. Ela não calcula os dígitos verificadores.
Por exemplo, 123.456.789-00 pode estar perfeitamente formatado e ainda assim ser um CPF inválido. Regex pode ajudar a conferir a aparência da entrada, mas não substitui o algoritmo do CPF.
Esquecer os zeros à esquerda
CPF é identificador, não número para fazer operações matemáticas comuns. Por isso, trate-o como string.
Se você converter um CPF para Number, um valor com zero inicial pode perder esse zero:
const cpf = Number("012.345.678-90");
Além disso, números muito grandes não devem ser usados como representação principal de documentos. A função deste artigo converte a entrada para texto com String(cpf) e remove a formatação antes de calcular.
Na prática, prefira manter o valor vindo do campo HTML como string desde o início.
Não normalizar a entrada
Se o código espera exatamente 11 dígitos, ele pode rejeitar um CPF formatado antes mesmo de fazer o cálculo.
Esta etapa resolve o problema:
cpf = String(cpf).replace(/\D/g, "");
Ela remove pontos, traços, espaços e outros caracteres não numéricos. Depois disso, a função verifica se sobraram exatamente 11 dígitos.
Validar apenas no navegador
A validação no front-end é útil para dar retorno imediato, mas não é uma camada de segurança. Um usuário pode fazer uma requisição diretamente ao servidor sem passar pelo JavaScript da página.
A mesma regra deve existir no back-end, de preferência em uma função centralizada e coberta por testes.
Perguntas frequentes
Como saber se um CPF é válido?
Primeiro, remova pontos e traço e confirme que restaram 11 dígitos. Depois, rejeite sequências com todos os dígitos iguais e calcule os dois dígitos verificadores conforme o algoritmo do CPF.
O CPF só será matematicamente válido se os dois dígitos calculados forem iguais aos dois últimos dígitos informados. A função validarCPF(cpf) apresentada neste artigo executa todas essas etapas.
Isso não significa que o documento esteja ativo, regular ou associado a uma pessoa específica. Significa apenas que ele passa pela validação matemática.
Como calcular o dígito verificador do CPF?
Para o primeiro dígito, multiplique os 9 dígitos base pelos pesos de 10 a 2. Some os resultados e calcule o resto da divisão por 11.
- Se o resto for 0 ou 1, o dígito será
0. - Caso contrário, o dígito será
11 - resto.
Para o segundo dígito, faça a mesma operação usando os 10 primeiros dígitos e os pesos de 11 a 2.
Em JavaScript, a parte central do cálculo pode ser escrita assim:
const digito = resto < 2 ? 0 : 11 - resto;
Validar CPF é a mesma coisa que consultar na Receita Federal?
Não. A validação matemática é uma verificação local: o sistema calcula os dígitos e compara o resultado com o CPF informado.
Uma consulta oficial é outra operação. Ela pode verificar informações cadastrais e a situação do CPF em uma base oficial, normalmente por meio de um serviço autorizado ou dos canais disponibilizados pela Receita Federal.
Portanto, um CPF pode passar pelo algoritmo e ainda não estar regular, não existir no cadastro consultado ou não pertencer à pessoa que o informou. O código JavaScript não confirma identidade nem situação cadastral.
Dá para gerar um CPF válido para testes?
Sim. Para testar máscaras, formulários e APIs, você pode usar números que passam pela validação matemática sem usar dados reais. Se você precisa de números de CPF válidos só para testar formulários, nosso gerador de CPF resolve isso rapidinho.
Use dados de teste de forma controlada e deixe claro, no ambiente da equipe, que eles são fictícios. Também evite colocar documentos reais em exemplos públicos, arquivos de teste ou repositórios.
A função valida se o CPF pertence ao usuário?
Não. Ela verifica somente o formato normalizado, a quantidade de dígitos, a regra dos dígitos verificadores e a rejeição de sequências repetidas.
Para confirmar titularidade, seria necessária uma etapa diferente, com uma fonte oficial ou um fluxo de verificação apropriado. A validação local não substitui esse processo.
Próximos passos
Agora você já tem o algoritmo do CPF e uma função validarCPF(cpf) pronta para adaptar ao seu projeto. Coloque a validação no front-end para orientar o usuário e repita a regra no back-end antes de persistir ou aceitar o cadastro.
Se quiser conferir valores sem escrever código, acesse o nosso verificador de CPF online. Depois, vale transformar os exemplos deste artigo em testes automatizados para cobrir entradas formatadas, CPFs inválidos e documentos com zeros à esquerda.