Função para Validar CPF em JavaScript
Função JavaScript para validar CPF usando o algoritmo de módulo 11. Aceita entrada com ou sem pontuação, rejeita sequências de dígitos repetidos e verifica ambos os dígitos verificadores.
Código
'use strict';
var CPF = function CPF() { };
var calcChecker1 = function calcChecker1(firstNineDigits) {
var sum = null;
for (var j = 0; j < 9; ++j) {
sum += firstNineDigits.toString().charAt(j) * (10 - j);
}
var lastSumChecker1 = sum % 11;
return lastSumChecker1 < 2 ? 0 : 11 - lastSumChecker1;
};
var calcChecker2 = function calcChecker2(cpfWithChecker1) {
var sum = null;
for (var k = 0; k < 10; ++k) {
sum += cpfWithChecker1.toString().charAt(k) * (11 - k);
}
var lastSumChecker2 = sum % 11;
return lastSumChecker2 < 2 ? 0 : 11 - lastSumChecker2;
};
CPF.validate = function (value) {
if (value && value !== true) {
if (typeof value === 'number') {
value = String(value);
}
var cleanCPF = value.replace(/[^\d]/g, '');
var firstNineDigits = cleanCPF.substring(0, 9);
var checker = cleanCPF.substring(9, 11);
if (cleanCPF.length !== 11) return false;
// Verifica se todos os dígitos são iguais
for (var i = 0; i < 10; i++) {
if ('' + firstNineDigits + checker === Array(12).join(i)) return false;
}
var checker1 = calcChecker1(firstNineDigits);
var checker2 = calcChecker2('' + firstNineDigits + checker1);
return checker.toString() === checker1.toString() + checker2.toString();
}
};
Análise do código
calcChecker1 recebe os 9 primeiros dígitos, multiplica cada um pelo peso decrescente (10 a 2), soma, aplica % 11 e retorna 0 se resto < 2, senão 11 - resto.
calcChecker2 faz o mesmo com os 10 primeiros dígitos (incluindo o primeiro verificador), usando pesos de 11 a 2.
CPF.validate limpa a entrada com regex [^\d], separa base e verificadores, rejeita CPFs com 11 dígitos iguais via Array(12).join(i), calcula os dois dígitos e compara com os informados.
Uso
CPF.validate("529.982.247-25"); // true
CPF.validate("111.111.111-11"); // false
CPF.validate("52998224725"); // true
Testes
Testes com Vitest ou Jest:
import { describe, it, expect } from 'vitest';
describe('CPF.validate', () => {
it('retorna true para CPF válido com pontuação', () => {
expect(CPF.validate('529.982.247-25')).toBe(true);
});
it('retorna true para CPF válido sem pontuação', () => {
expect(CPF.validate('52998224725')).toBe(true);
});
it('retorna false para CPF com dígitos repetidos', () => {
expect(CPF.validate('111.111.111-11')).toBe(false);
});
it('retorna false para CPF com dígito verificador incorreto', () => {
expect(CPF.validate('529.982.247-26')).toBe(false);
});
it('retorna false para CPF com tamanho incorreto', () => {
expect(CPF.validate('123.456.789')).toBe(false);
});
});
Precisa de CPFs válidos para rodar esses testes? Use o gerador de CPF online para criar números de teste em lote.
Veja também: máscara de CPF em JavaScript.