OBS: O algoritmo possui um bug. Nem todo CPF que ele gera é válido. Necessário corrigir.
(function () {
aleatorio = function () {
aleat = Math.floor(Math.random() * 999);
//o preenchimento dos zeros à esquerda é mais facil com a função padStart da string
return ("" + aleat).padStart(3, '0');
};
//o quarto parametro(n4) só será recebido para o segundo digito
dig = function (n1, n2, n3, n4) {
//as concatenações todas juntas uma vez que são curtas e legíveis
nums = n1.split("").concat(n2.split(""), n3.split(""));
if (n4){ //se for o segundo digito coloca o n4 no sitio certo
nums[9] = n4;
}
x = 0;
//o j é também iniciado e incrementado no for para aproveitar a própria sintaxe dele
//o i tem inicios diferentes consoante é 1º ou 2º digito verificador
for (i = (n4 ? 11:10), j = 0; i >= 2; i--, j++) {
x += parseInt(nums[j]) * i;
}
y = x % 11;
//ternário aqui pois ambos os retornos são simples e continua legivel
return y < 2 ? 0 : 11 - y;
};
gerarCpf = function () {
num1 = aleatorio(); //aleatorio já devolve string, logo não precisa de toString
num2 = aleatorio();
num3 = aleatorio();
dig1 = dig(num1, num2, num3); //agora só uma função dig
dig2 = dig(num1, num2, num3, dig1); //mesma função dig aqui
//aqui com interpolação de strings fica bem mais legivel
return num1+"."+num2+"."+num3+"-"+dig1+dig2;//`${num1}.${num2}.${num3}-${dig1}${dig2}`;
};
return gerarCpf();
})()
return (aleatorio=function(){return aleat=Math.floor(999*Math.random()),(""+aleat).padStart(3,"0")},dig=function(n,a,t,u){for(nums=n.split("").concat(a.split(""),t.split("")),u&&(nums[9]=u),x=0,i=u?11:10,j=0;i>=2;i--,j++)x+=parseInt(nums[j])*i;return y=x%11,y<2?0:11-y},gerarCpf=function(){return num1=aleatorio(),num2=aleatorio(),num3=aleatorio(),dig1=dig(num1,num2,num3),dig2=dig(num1,num2,num3,dig1),num1+"."+num2+"."+num3+"-"+dig1+dig2},gerarCpf())