Olá! Acabei testando meu próprio CPF por curiosidade e percebi que, aparentemente, a lógica implementada não tolera que esses dois dígitos sejam iguais.
A lógica inicialmente era esta mesmo? Ou deixei escapar algum detalhe de código? Vou deixar ele aqui para caso alguém tenha a mesma dúvida ou saiba se faltou algo:
function checaCPFRepetido(cpf) {
const valoresRepetidos = [
'00000000000',
'11111111111',
'22222222222',
'33333333333',
'44444444444',
'55555555555',
'66666666666',
'77777777777',
'88888888888',
'99999999999'
];
let cpfValido = true;
valoresRepetidos.forEach(valor => {
if(valor == cpf) {
cpfValido = false;
}
});
return cpfValido;
}
function checaEstruturaCPF(cpf) {
const multiplicador = 10;
return checaDigitoVerificador(cpf, multiplicador);
}
function checaDigitoVerificador(cpf, multiplicador) {
if(multiplicador >= 12) {
return true;
}
let multiplicadorInicial = multiplicador; // para o for abaixo não sobrescrever;
let soma = 0; // pegando o cpf sem dígitos (de 0 até 9... 10 e 11 são os dígitos verificadores)
const cpfSemDigitos = cpf.substr(0, multiplicador - 1).split('');
const digitoVerificador = cpf.charAt(multiplicador - 1);
for(let contador = 0; multiplicadorInicial > 1; multiplicadorInicial--) {
soma = soma + cpfSemDigitos[contador] * multiplicadorInicial;
contador++;
}
if(digitoVerificador == confirmaDigito(soma)) {
return checaDigitoVerificador(cpf, multiplicador + 1);
}
return false;
}
function confirmaDigito(soma) {
return 11 - (soma % 11);
}
Abraços!