O Gerador De CPF O Gerador De CPF

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.