[{"data":1,"prerenderedAt":1664},["ShallowReactive",2],{"pt-BR-article-\u002Fblog\u002Fcomo-validar-cpf-com-javascript":3,"pt-BR-related-posts-\u002Fblog\u002Fcomo-validar-cpf-com-javascript":1505},{"id":4,"title":5,"articleCover":6,"articleCoverEmbed":7,"articleCoverEmbedUploadDate":7,"articleCoverHeight":8,"articleCoverWidth":9,"authorId":10,"body":11,"categoriesIds":1490,"description":1492,"enAlternateSlug":1493,"extension":1494,"meta":1495,"navigation":285,"path":1496,"ptBrAlternateSlug":1497,"publishedAt":1498,"seo":1499,"sitemap":1500,"stem":1502,"updatedAt":1501,"wordCount":1503,"__hash__":1504},"blog\u002Fblog\u002Fcomo-validar-cpf-com-javascript.md","Como validar um CPF com JavaScript","\u002Fimages\u002Fblog\u002Fjavascript\u002Fcomo-validar-cpf-com-javascript.webp",null,720,1280,"thiago-nunes-batista",{"type":12,"value":13,"toc":1467},"minimark",[14,18,26,31,34,44,47,50,55,58,69,72,78,81,87,90,96,99,105,108,114,121,125,128,134,137,143,146,152,155,161,164,170,177,182,185,189,196,199,761,764,888,900,903,926,932,939,949,953,956,1149,1152,1156,1160,1163,1204,1211,1218,1222,1225,1232,1259,1266,1269,1273,1276,1279,1313,1316,1320,1323,1326,1330,1334,1337,1344,1347,1351,1354,1368,1371,1374,1406,1410,1413,1416,1419,1423,1432,1435,1439,1442,1445,1449,1455,1463],[15,16,17],"p",{},"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.",[15,19,20,21,25],{},"Neste artigo, você vai entender o algoritmo do CPF e implementar uma função de ",[22,23,24],"strong",{},"validação de CPF"," em JavaScript puro, sem biblioteca externa.",[27,28,30],"h2",{"id":29},"o-que-são-os-dígitos-verificadores","O que são os dígitos verificadores",[15,32,33],{},"Um CPF tem 11 dígitos:",[35,36,37,41],"ul",{},[38,39,40],"li",{},"Os 9 primeiros são a base do documento.",[38,42,43],{},"Os 2 últimos são os dígitos verificadores.",[15,45,46],{},"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.",[15,48,49],{},"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.",[51,52,54],"h3",{"id":53},"primeiro-dígito-verificador","Primeiro dígito verificador",[15,56,57],{},"Considere o CPF sem formatação:",[59,60,66],"pre",{"className":61,"code":63,"language":64,"meta":65},[62],"language-text","52998224725\n","text","",[67,68,63],"code",{"__ignoreMap":65},[15,70,71],{},"Os 9 primeiros dígitos são:",[59,73,76],{"className":74,"code":75,"language":64,"meta":65},[62],"5 2 9 9 8 2 2 4 7\n",[67,77,75],{"__ignoreMap":65},[15,79,80],{},"Multiplicamos cada número pelos pesos de 10 a 2:",[59,82,85],{"className":83,"code":84,"language":64,"meta":65},[62],"5×10 + 2×9 + 9×8 + 9×7 + 8×6 + 2×5 + 2×4 + 4×3 + 7×2\n",[67,86,84],{"__ignoreMap":65},[15,88,89],{},"O resultado é:",[59,91,94],{"className":92,"code":93,"language":64,"meta":65},[62],"50 + 18 + 72 + 63 + 48 + 10 + 8 + 12 + 14 = 295\n",[67,95,93],{"__ignoreMap":65},[15,97,98],{},"Agora calculamos o resto da divisão por 11:",[59,100,103],{"className":101,"code":102,"language":64,"meta":65},[62],"295 % 11 = 9\n",[67,104,102],{"__ignoreMap":65},[15,106,107],{},"Como o resto é maior que 1, fazemos:",[59,109,112],{"className":110,"code":111,"language":64,"meta":65},[62],"11 - 9 = 2\n",[67,113,111],{"__ignoreMap":65},[15,115,116,117,120],{},"Portanto, o primeiro dígito verificador é ",[67,118,119],{},"2",".",[51,122,124],{"id":123},"segundo-dígito-verificador","Segundo dígito verificador",[15,126,127],{},"Agora usamos os 10 primeiros dígitos, incluindo o verificador calculado:",[59,129,132],{"className":130,"code":131,"language":64,"meta":65},[62],"5 2 9 9 8 2 2 4 7 2\n",[67,133,131],{"__ignoreMap":65},[15,135,136],{},"Aplicamos os pesos de 11 a 2:",[59,138,141],{"className":139,"code":140,"language":64,"meta":65},[62],"5×11 + 2×10 + 9×9 + 9×8 + 8×7 + 2×6 + 2×5 + 4×4 + 7×3 + 2×2\n",[67,142,140],{"__ignoreMap":65},[15,144,145],{},"A soma fica:",[59,147,150],{"className":148,"code":149,"language":64,"meta":65},[62],"55 + 20 + 81 + 72 + 56 + 12 + 10 + 16 + 21 + 4 = 347\n",[67,151,149],{"__ignoreMap":65},[15,153,154],{},"O resto da divisão por 11 é:",[59,156,159],{"className":157,"code":158,"language":64,"meta":65},[62],"347 % 11 = 6\n",[67,160,158],{"__ignoreMap":65},[15,162,163],{},"Como o resto é maior que 1:",[59,165,168],{"className":166,"code":167,"language":64,"meta":65},[62],"11 - 6 = 5\n",[67,169,167],{"__ignoreMap":65},[15,171,172,173,176],{},"O segundo dígito verificador é ",[67,174,175],{},"5",". Assim, o CPF completo é:",[59,178,180],{"className":179,"code":63,"language":64,"meta":65},[62],[67,181,63],{"__ignoreMap":65},[15,183,184],{},"Esse é o algoritmo do CPF: calcular o primeiro dígito, incorporá-lo à sequência e calcular o segundo.",[27,186,188],{"id":187},"implementação-em-javascript-puro","Implementação em JavaScript puro",[15,190,191,192,195],{},"A função precisa lidar com entradas formatadas, como ",[67,193,194],{},"529.982.247-25",", e também com uma sequência de números sem pontuação.",[15,197,198],{},"Uma implementação possível é esta:",[59,200,204],{"className":201,"code":202,"language":203,"meta":65,"style":65},"language-javascript shiki shiki-themes dracula","function validarCPF(cpf) {\n  \u002F\u002F Garante que a entrada seja tratada como texto\n  cpf = String(cpf).replace(\u002F\\D\u002Fg, \"\");\n\n  \u002F\u002F Um CPF válido deve ter exatamente 11 dígitos\n  if (cpf.length !== 11) {\n    return false;\n  }\n\n  \u002F\u002F Rejeita CPFs formados pelo mesmo dígito\n  if (\u002F^(\\d)\\1{10}$\u002F.test(cpf)) {\n    return false;\n  }\n\n  \u002F\u002F Calcula o primeiro dígito verificador\n  let soma = 0;\n\n  for (let i = 0; i \u003C 9; i++) {\n    soma += Number(cpf[i]) * (10 - i);\n  }\n\n  let resto = soma % 11;\n  const primeiroDigito = resto \u003C 2 ? 0 : 11 - resto;\n\n  \u002F\u002F O primeiro dígito calculado deve ser igual ao informado\n  if (primeiroDigito !== Number(cpf[9])) {\n    return false;\n  }\n\n  \u002F\u002F Calcula o segundo dígito verificador\n  soma = 0;\n\n  for (let i = 0; i \u003C 10; i++) {\n    soma += Number(cpf[i]) * (11 - i);\n  }\n\n  resto = soma % 11;\n  const segundoDigito = resto \u003C 2 ? 0 : 11 - resto;\n\n  \u002F\u002F O segundo dígito calculado também deve ser igual ao informado\n  return segundoDigito === Number(cpf[10]);\n}\n","javascript",[67,205,206,230,237,280,287,293,310,322,328,333,339,374,383,388,393,399,415,420,455,484,489,494,513,546,551,557,578,587,592,597,603,615,620,648,670,675,680,696,724,729,735,755],{"__ignoreMap":65},[207,208,211,215,219,223,227],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"s0Tla","function",[207,216,218],{"class":217},"sAOxA"," validarCPF",[207,220,222],{"class":221},"sCdxs","(",[207,224,226],{"class":225},"sGEwX","cpf",[207,228,229],{"class":221},") {\n",[207,231,233],{"class":209,"line":232},2,[207,234,236],{"class":235},"shSDL","  \u002F\u002F Garante que a entrada seja tratada como texto\n",[207,238,240,243,246,249,252,255,257,261,265,267,270,273,277],{"class":209,"line":239},3,[207,241,242],{"class":221},"  cpf ",[207,244,245],{"class":213},"=",[207,247,248],{"class":217}," String",[207,250,251],{"class":221},"(cpf).",[207,253,254],{"class":217},"replace",[207,256,222],{"class":221},[207,258,260],{"class":259},"s-doY","\u002F",[207,262,264],{"class":263},"sIQBb","\\D",[207,266,260],{"class":259},[207,268,269],{"class":213},"g",[207,271,272],{"class":221},", ",[207,274,276],{"class":275},"seVfx","\"\"",[207,278,279],{"class":221},");\n",[207,281,283],{"class":209,"line":282},4,[207,284,286],{"emptyLinePlaceholder":285},true,"\n",[207,288,290],{"class":209,"line":289},5,[207,291,292],{"class":235},"  \u002F\u002F Um CPF válido deve ter exatamente 11 dígitos\n",[207,294,296,299,302,305,308],{"class":209,"line":295},6,[207,297,298],{"class":213},"  if",[207,300,301],{"class":221}," (cpf.length ",[207,303,304],{"class":213},"!==",[207,306,307],{"class":263}," 11",[207,309,229],{"class":221},[207,311,313,316,319],{"class":209,"line":312},7,[207,314,315],{"class":213},"    return",[207,317,318],{"class":263}," false",[207,320,321],{"class":221},";\n",[207,323,325],{"class":209,"line":324},8,[207,326,327],{"class":221},"  }\n",[207,329,331],{"class":209,"line":330},9,[207,332,286],{"emptyLinePlaceholder":285},[207,334,336],{"class":209,"line":335},10,[207,337,338],{"class":235},"  \u002F\u002F Rejeita CPFs formados pelo mesmo dígito\n",[207,340,342,344,347,349,352,355,358,361,364,366,368,371],{"class":209,"line":341},11,[207,343,298],{"class":213},[207,345,346],{"class":221}," (",[207,348,260],{"class":259},[207,350,351],{"class":213},"^",[207,353,222],{"class":354},"smvxG",[207,356,357],{"class":263},"\\d",[207,359,360],{"class":354},")",[207,362,363],{"class":213},"\\1{10}$",[207,365,260],{"class":259},[207,367,120],{"class":221},[207,369,370],{"class":217},"test",[207,372,373],{"class":221},"(cpf)) {\n",[207,375,377,379,381],{"class":209,"line":376},12,[207,378,315],{"class":213},[207,380,318],{"class":263},[207,382,321],{"class":221},[207,384,386],{"class":209,"line":385},13,[207,387,327],{"class":221},[207,389,391],{"class":209,"line":390},14,[207,392,286],{"emptyLinePlaceholder":285},[207,394,396],{"class":209,"line":395},15,[207,397,398],{"class":235},"  \u002F\u002F Calcula o primeiro dígito verificador\n",[207,400,402,405,408,410,413],{"class":209,"line":401},16,[207,403,404],{"class":213},"  let",[207,406,407],{"class":221}," soma ",[207,409,245],{"class":213},[207,411,412],{"class":263}," 0",[207,414,321],{"class":221},[207,416,418],{"class":209,"line":417},17,[207,419,286],{"emptyLinePlaceholder":285},[207,421,423,426,428,431,434,436,438,441,444,447,450,453],{"class":209,"line":422},18,[207,424,425],{"class":213},"  for",[207,427,346],{"class":221},[207,429,430],{"class":213},"let",[207,432,433],{"class":221}," i ",[207,435,245],{"class":213},[207,437,412],{"class":263},[207,439,440],{"class":221},"; i ",[207,442,443],{"class":213},"\u003C",[207,445,446],{"class":263}," 9",[207,448,449],{"class":221},"; i",[207,451,452],{"class":213},"++",[207,454,229],{"class":221},[207,456,458,461,464,467,470,473,475,478,481],{"class":209,"line":457},19,[207,459,460],{"class":221},"    soma ",[207,462,463],{"class":213},"+=",[207,465,466],{"class":217}," Number",[207,468,469],{"class":221},"(cpf[i]) ",[207,471,472],{"class":213},"*",[207,474,346],{"class":221},[207,476,477],{"class":263},"10",[207,479,480],{"class":213}," -",[207,482,483],{"class":221}," i);\n",[207,485,487],{"class":209,"line":486},20,[207,488,327],{"class":221},[207,490,492],{"class":209,"line":491},21,[207,493,286],{"emptyLinePlaceholder":285},[207,495,497,499,502,504,506,509,511],{"class":209,"line":496},22,[207,498,404],{"class":213},[207,500,501],{"class":221}," resto ",[207,503,245],{"class":213},[207,505,407],{"class":221},[207,507,508],{"class":213},"%",[207,510,307],{"class":263},[207,512,321],{"class":221},[207,514,516,519,522,524,526,528,531,534,536,539,541,543],{"class":209,"line":515},23,[207,517,518],{"class":213},"  const",[207,520,521],{"class":221}," primeiroDigito ",[207,523,245],{"class":213},[207,525,501],{"class":221},[207,527,443],{"class":213},[207,529,530],{"class":263}," 2",[207,532,533],{"class":213}," ?",[207,535,412],{"class":263},[207,537,538],{"class":213}," :",[207,540,307],{"class":263},[207,542,480],{"class":213},[207,544,545],{"class":221}," resto;\n",[207,547,549],{"class":209,"line":548},24,[207,550,286],{"emptyLinePlaceholder":285},[207,552,554],{"class":209,"line":553},25,[207,555,556],{"class":235},"  \u002F\u002F O primeiro dígito calculado deve ser igual ao informado\n",[207,558,560,562,565,567,569,572,575],{"class":209,"line":559},26,[207,561,298],{"class":213},[207,563,564],{"class":221}," (primeiroDigito ",[207,566,304],{"class":213},[207,568,466],{"class":217},[207,570,571],{"class":221},"(cpf[",[207,573,574],{"class":263},"9",[207,576,577],{"class":221},"])) {\n",[207,579,581,583,585],{"class":209,"line":580},27,[207,582,315],{"class":213},[207,584,318],{"class":263},[207,586,321],{"class":221},[207,588,590],{"class":209,"line":589},28,[207,591,327],{"class":221},[207,593,595],{"class":209,"line":594},29,[207,596,286],{"emptyLinePlaceholder":285},[207,598,600],{"class":209,"line":599},30,[207,601,602],{"class":235},"  \u002F\u002F Calcula o segundo dígito verificador\n",[207,604,606,609,611,613],{"class":209,"line":605},31,[207,607,608],{"class":221},"  soma ",[207,610,245],{"class":213},[207,612,412],{"class":263},[207,614,321],{"class":221},[207,616,618],{"class":209,"line":617},32,[207,619,286],{"emptyLinePlaceholder":285},[207,621,623,625,627,629,631,633,635,637,639,642,644,646],{"class":209,"line":622},33,[207,624,425],{"class":213},[207,626,346],{"class":221},[207,628,430],{"class":213},[207,630,433],{"class":221},[207,632,245],{"class":213},[207,634,412],{"class":263},[207,636,440],{"class":221},[207,638,443],{"class":213},[207,640,641],{"class":263}," 10",[207,643,449],{"class":221},[207,645,452],{"class":213},[207,647,229],{"class":221},[207,649,651,653,655,657,659,661,663,666,668],{"class":209,"line":650},34,[207,652,460],{"class":221},[207,654,463],{"class":213},[207,656,466],{"class":217},[207,658,469],{"class":221},[207,660,472],{"class":213},[207,662,346],{"class":221},[207,664,665],{"class":263},"11",[207,667,480],{"class":213},[207,669,483],{"class":221},[207,671,673],{"class":209,"line":672},35,[207,674,327],{"class":221},[207,676,678],{"class":209,"line":677},36,[207,679,286],{"emptyLinePlaceholder":285},[207,681,683,686,688,690,692,694],{"class":209,"line":682},37,[207,684,685],{"class":221},"  resto ",[207,687,245],{"class":213},[207,689,407],{"class":221},[207,691,508],{"class":213},[207,693,307],{"class":263},[207,695,321],{"class":221},[207,697,699,701,704,706,708,710,712,714,716,718,720,722],{"class":209,"line":698},38,[207,700,518],{"class":213},[207,702,703],{"class":221}," segundoDigito ",[207,705,245],{"class":213},[207,707,501],{"class":221},[207,709,443],{"class":213},[207,711,530],{"class":263},[207,713,533],{"class":213},[207,715,412],{"class":263},[207,717,538],{"class":213},[207,719,307],{"class":263},[207,721,480],{"class":213},[207,723,545],{"class":221},[207,725,727],{"class":209,"line":726},39,[207,728,286],{"emptyLinePlaceholder":285},[207,730,732],{"class":209,"line":731},40,[207,733,734],{"class":235},"  \u002F\u002F O segundo dígito calculado também deve ser igual ao informado\n",[207,736,738,741,743,746,748,750,752],{"class":209,"line":737},41,[207,739,740],{"class":213},"  return",[207,742,703],{"class":221},[207,744,745],{"class":213},"===",[207,747,466],{"class":217},[207,749,571],{"class":221},[207,751,477],{"class":263},[207,753,754],{"class":221},"]);\n",[207,756,758],{"class":209,"line":757},42,[207,759,760],{"class":221},"}\n",[15,762,763],{},"Exemplos de uso:",[59,765,767],{"className":201,"code":766,"language":203,"meta":65,"style":65},"console.log(validarCPF(\"529.982.247-25\"));\n\u002F\u002F true\n\nconsole.log(validarCPF(\"52998224725\"));\n\u002F\u002F true\n\nconsole.log(validarCPF(\"529.982.247-26\"));\n\u002F\u002F false\n\nconsole.log(validarCPF(\"111.111.111-11\"));\n\u002F\u002F false\n",[67,768,769,795,800,804,825,829,833,854,859,863,884],{"__ignoreMap":65},[207,770,771,774,777,779,782,784,787,790,792],{"class":209,"line":210},[207,772,773],{"class":221},"console.",[207,775,776],{"class":217},"log",[207,778,222],{"class":221},[207,780,781],{"class":217},"validarCPF",[207,783,222],{"class":221},[207,785,786],{"class":275},"\"",[207,788,194],{"class":789},"s-mGx",[207,791,786],{"class":275},[207,793,794],{"class":221},"));\n",[207,796,797],{"class":209,"line":232},[207,798,799],{"class":235},"\u002F\u002F true\n",[207,801,802],{"class":209,"line":239},[207,803,286],{"emptyLinePlaceholder":285},[207,805,806,808,810,812,814,816,818,821,823],{"class":209,"line":282},[207,807,773],{"class":221},[207,809,776],{"class":217},[207,811,222],{"class":221},[207,813,781],{"class":217},[207,815,222],{"class":221},[207,817,786],{"class":275},[207,819,820],{"class":789},"52998224725",[207,822,786],{"class":275},[207,824,794],{"class":221},[207,826,827],{"class":209,"line":289},[207,828,799],{"class":235},[207,830,831],{"class":209,"line":295},[207,832,286],{"emptyLinePlaceholder":285},[207,834,835,837,839,841,843,845,847,850,852],{"class":209,"line":312},[207,836,773],{"class":221},[207,838,776],{"class":217},[207,840,222],{"class":221},[207,842,781],{"class":217},[207,844,222],{"class":221},[207,846,786],{"class":275},[207,848,849],{"class":789},"529.982.247-26",[207,851,786],{"class":275},[207,853,794],{"class":221},[207,855,856],{"class":209,"line":324},[207,857,858],{"class":235},"\u002F\u002F false\n",[207,860,861],{"class":209,"line":330},[207,862,286],{"emptyLinePlaceholder":285},[207,864,865,867,869,871,873,875,877,880,882],{"class":209,"line":335},[207,866,773],{"class":221},[207,868,776],{"class":217},[207,870,222],{"class":221},[207,872,781],{"class":217},[207,874,222],{"class":221},[207,876,786],{"class":275},[207,878,879],{"class":789},"111.111.111-11",[207,881,786],{"class":275},[207,883,794],{"class":221},[207,885,886],{"class":209,"line":341},[207,887,858],{"class":235},[15,889,890,891,894,895,897,898,120],{},"O trecho ",[67,892,893],{},"replace(\u002F\\D\u002Fg, '')"," remove tudo que não for dígito. Isso permite aceitar tanto ",[67,896,194],{}," quanto ",[67,899,820],{},[15,901,902],{},"A expressão regular usada para dígitos repetidos merece atenção:",[59,904,906],{"className":201,"code":905,"language":203,"meta":65,"style":65},"\u002F^(\\d)\\1{10}$\u002F;\n",[67,907,908],{"__ignoreMap":65},[207,909,910,912,914,916,918,920,922,924],{"class":209,"line":210},[207,911,260],{"class":259},[207,913,351],{"class":213},[207,915,222],{"class":354},[207,917,357],{"class":263},[207,919,360],{"class":354},[207,921,363],{"class":213},[207,923,260],{"class":259},[207,925,321],{"class":221},[15,927,928,929,931],{},"Ela identifica uma sequência de 11 caracteres formada pelo mesmo dígito. Isso impede que valores como ",[67,930,879],{}," sejam aceitos.",[15,933,934,935,938],{},"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, ",[67,936,937],{},"11111111111"," será considerado válido pelo seu código.",[15,940,941,942,120],{},"Se quiser testar entradas rapidamente sem criar um formulário, use ",[943,944,948],"a",{"href":945,"rel":946},"https:\u002F\u002Fcodigoaoponto.com\u002Fferramentas\u002Fvalidador-de-cpf",[947],"nofollow","nosso validador de CPF online, gratuito",[51,950,952],{"id":951},"validação-no-formulário","Validação no formulário",[15,954,955],{},"Você pode chamar a função no evento de envio do formulário:",[59,957,959],{"className":201,"code":958,"language":203,"meta":65,"style":65},"const formulario = document.querySelector(\"#formulario\");\nconst campoCPF = document.querySelector(\"#cpf\");\nconst mensagem = document.querySelector(\"#mensagem\");\n\nformulario.addEventListener(\"submit\", function (evento) {\n  evento.preventDefault();\n\n  if (!validarCPF(campoCPF.value)) {\n    mensagem.textContent = \"Informe um CPF válido.\";\n    return;\n  }\n\n  mensagem.textContent = \"CPF válido.\";\n});\n",[67,960,961,988,1012,1036,1040,1068,1079,1083,1097,1114,1120,1124,1128,1144],{"__ignoreMap":65},[207,962,963,966,969,971,974,977,979,981,984,986],{"class":209,"line":210},[207,964,965],{"class":213},"const",[207,967,968],{"class":221}," formulario ",[207,970,245],{"class":213},[207,972,973],{"class":221}," document.",[207,975,976],{"class":217},"querySelector",[207,978,222],{"class":221},[207,980,786],{"class":275},[207,982,983],{"class":789},"#formulario",[207,985,786],{"class":275},[207,987,279],{"class":221},[207,989,990,992,995,997,999,1001,1003,1005,1008,1010],{"class":209,"line":232},[207,991,965],{"class":213},[207,993,994],{"class":221}," campoCPF ",[207,996,245],{"class":213},[207,998,973],{"class":221},[207,1000,976],{"class":217},[207,1002,222],{"class":221},[207,1004,786],{"class":275},[207,1006,1007],{"class":789},"#cpf",[207,1009,786],{"class":275},[207,1011,279],{"class":221},[207,1013,1014,1016,1019,1021,1023,1025,1027,1029,1032,1034],{"class":209,"line":239},[207,1015,965],{"class":213},[207,1017,1018],{"class":221}," mensagem ",[207,1020,245],{"class":213},[207,1022,973],{"class":221},[207,1024,976],{"class":217},[207,1026,222],{"class":221},[207,1028,786],{"class":275},[207,1030,1031],{"class":789},"#mensagem",[207,1033,786],{"class":275},[207,1035,279],{"class":221},[207,1037,1038],{"class":209,"line":282},[207,1039,286],{"emptyLinePlaceholder":285},[207,1041,1042,1045,1048,1050,1052,1055,1057,1059,1061,1063,1066],{"class":209,"line":289},[207,1043,1044],{"class":221},"formulario.",[207,1046,1047],{"class":217},"addEventListener",[207,1049,222],{"class":221},[207,1051,786],{"class":275},[207,1053,1054],{"class":789},"submit",[207,1056,786],{"class":275},[207,1058,272],{"class":221},[207,1060,214],{"class":213},[207,1062,346],{"class":221},[207,1064,1065],{"class":225},"evento",[207,1067,229],{"class":221},[207,1069,1070,1073,1076],{"class":209,"line":295},[207,1071,1072],{"class":221},"  evento.",[207,1074,1075],{"class":217},"preventDefault",[207,1077,1078],{"class":221},"();\n",[207,1080,1081],{"class":209,"line":312},[207,1082,286],{"emptyLinePlaceholder":285},[207,1084,1085,1087,1089,1092,1094],{"class":209,"line":324},[207,1086,298],{"class":213},[207,1088,346],{"class":221},[207,1090,1091],{"class":213},"!",[207,1093,781],{"class":217},[207,1095,1096],{"class":221},"(campoCPF.value)) {\n",[207,1098,1099,1102,1104,1107,1110,1112],{"class":209,"line":330},[207,1100,1101],{"class":221},"    mensagem.textContent ",[207,1103,245],{"class":213},[207,1105,1106],{"class":275}," \"",[207,1108,1109],{"class":789},"Informe um CPF válido.",[207,1111,786],{"class":275},[207,1113,321],{"class":221},[207,1115,1116,1118],{"class":209,"line":335},[207,1117,315],{"class":213},[207,1119,321],{"class":221},[207,1121,1122],{"class":209,"line":341},[207,1123,327],{"class":221},[207,1125,1126],{"class":209,"line":376},[207,1127,286],{"emptyLinePlaceholder":285},[207,1129,1130,1133,1135,1137,1140,1142],{"class":209,"line":385},[207,1131,1132],{"class":221},"  mensagem.textContent ",[207,1134,245],{"class":213},[207,1136,1106],{"class":275},[207,1138,1139],{"class":789},"CPF válido.",[207,1141,786],{"class":275},[207,1143,321],{"class":221},[207,1145,1146],{"class":209,"line":390},[207,1147,1148],{"class":221},"});\n",[15,1150,1151],{},"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.",[27,1153,1155],{"id":1154},"erros-comuns","Erros comuns",[51,1157,1159],{"id":1158},"validar-cpf-só-com-regex-de-formato","Validar CPF só com regex de formato",[15,1161,1162],{},"Uma expressão como esta:",[59,1164,1166],{"className":201,"code":1165,"language":203,"meta":65,"style":65},"\u002F^\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}$\u002F;\n",[67,1167,1168],{"__ignoreMap":65},[207,1169,1170,1172,1174,1176,1179,1182,1184,1186,1188,1190,1192,1195,1197,1200,1202],{"class":209,"line":210},[207,1171,260],{"class":259},[207,1173,351],{"class":213},[207,1175,357],{"class":263},[207,1177,1178],{"class":213},"{3}",[207,1180,1181],{"class":789},"\\.",[207,1183,357],{"class":263},[207,1185,1178],{"class":213},[207,1187,1181],{"class":789},[207,1189,357],{"class":263},[207,1191,1178],{"class":213},[207,1193,1194],{"class":789},"-",[207,1196,357],{"class":263},[207,1198,1199],{"class":213},"{2}$",[207,1201,260],{"class":259},[207,1203,321],{"class":221},[15,1205,1206,1207,1210],{},"verifica apenas se o texto tem o formato ",[67,1208,1209],{},"000.000.000-00",". Ela não calcula os dígitos verificadores.",[15,1212,1213,1214,1217],{},"Por exemplo, ",[67,1215,1216],{},"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.",[51,1219,1221],{"id":1220},"esquecer-os-zeros-à-esquerda","Esquecer os zeros à esquerda",[15,1223,1224],{},"CPF é identificador, não número para fazer operações matemáticas comuns. Por isso, trate-o como string.",[15,1226,1227,1228,1231],{},"Se você converter um CPF para ",[67,1229,1230],{},"Number",", um valor com zero inicial pode perder esse zero:",[59,1233,1235],{"className":201,"code":1234,"language":203,"meta":65,"style":65},"const cpf = Number(\"012.345.678-90\");\n",[67,1236,1237],{"__ignoreMap":65},[207,1238,1239,1241,1244,1246,1248,1250,1252,1255,1257],{"class":209,"line":210},[207,1240,965],{"class":213},[207,1242,1243],{"class":221}," cpf ",[207,1245,245],{"class":213},[207,1247,466],{"class":217},[207,1249,222],{"class":221},[207,1251,786],{"class":275},[207,1253,1254],{"class":789},"012.345.678-90",[207,1256,786],{"class":275},[207,1258,279],{"class":221},[15,1260,1261,1262,1265],{},"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 ",[67,1263,1264],{},"String(cpf)"," e remove a formatação antes de calcular.",[15,1267,1268],{},"Na prática, prefira manter o valor vindo do campo HTML como string desde o início.",[51,1270,1272],{"id":1271},"não-normalizar-a-entrada","Não normalizar a entrada",[15,1274,1275],{},"Se o código espera exatamente 11 dígitos, ele pode rejeitar um CPF formatado antes mesmo de fazer o cálculo.",[15,1277,1278],{},"Esta etapa resolve o problema:",[59,1280,1282],{"className":201,"code":1281,"language":203,"meta":65,"style":65},"cpf = String(cpf).replace(\u002F\\D\u002Fg, \"\");\n",[67,1283,1284],{"__ignoreMap":65},[207,1285,1286,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311],{"class":209,"line":210},[207,1287,1288],{"class":221},"cpf ",[207,1290,245],{"class":213},[207,1292,248],{"class":217},[207,1294,251],{"class":221},[207,1296,254],{"class":217},[207,1298,222],{"class":221},[207,1300,260],{"class":259},[207,1302,264],{"class":263},[207,1304,260],{"class":259},[207,1306,269],{"class":213},[207,1308,272],{"class":221},[207,1310,276],{"class":275},[207,1312,279],{"class":221},[15,1314,1315],{},"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.",[51,1317,1319],{"id":1318},"validar-apenas-no-navegador","Validar apenas no navegador",[15,1321,1322],{},"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.",[15,1324,1325],{},"A mesma regra deve existir no back-end, de preferência em uma função centralizada e coberta por testes.",[27,1327,1329],{"id":1328},"perguntas-frequentes","Perguntas frequentes",[51,1331,1333],{"id":1332},"como-saber-se-um-cpf-é-válido","Como saber se um CPF é válido?",[15,1335,1336],{},"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.",[15,1338,1339,1340,1343],{},"O CPF só será matematicamente válido se os dois dígitos calculados forem iguais aos dois últimos dígitos informados. A função ",[67,1341,1342],{},"validarCPF(cpf)"," apresentada neste artigo executa todas essas etapas.",[15,1345,1346],{},"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.",[51,1348,1350],{"id":1349},"como-calcular-o-dígito-verificador-do-cpf","Como calcular o dígito verificador do CPF?",[15,1352,1353],{},"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.",[35,1355,1356,1362],{},[38,1357,1358,1359,120],{},"Se o resto for 0 ou 1, o dígito será ",[67,1360,1361],{},"0",[38,1363,1364,1365,120],{},"Caso contrário, o dígito será ",[67,1366,1367],{},"11 - resto",[15,1369,1370],{},"Para o segundo dígito, faça a mesma operação usando os 10 primeiros dígitos e os pesos de 11 a 2.",[15,1372,1373],{},"Em JavaScript, a parte central do cálculo pode ser escrita assim:",[59,1375,1377],{"className":201,"code":1376,"language":203,"meta":65,"style":65},"const digito = resto \u003C 2 ? 0 : 11 - resto;\n",[67,1378,1379],{"__ignoreMap":65},[207,1380,1381,1383,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404],{"class":209,"line":210},[207,1382,965],{"class":213},[207,1384,1385],{"class":221}," digito ",[207,1387,245],{"class":213},[207,1389,501],{"class":221},[207,1391,443],{"class":213},[207,1393,530],{"class":263},[207,1395,533],{"class":213},[207,1397,412],{"class":263},[207,1399,538],{"class":213},[207,1401,307],{"class":263},[207,1403,480],{"class":213},[207,1405,545],{"class":221},[51,1407,1409],{"id":1408},"validar-cpf-é-a-mesma-coisa-que-consultar-na-receita-federal","Validar CPF é a mesma coisa que consultar na Receita Federal?",[15,1411,1412],{},"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.",[15,1414,1415],{},"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.",[15,1417,1418],{},"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.",[51,1420,1422],{"id":1421},"dá-para-gerar-um-cpf-válido-para-testes","Dá para gerar um CPF válido para testes?",[15,1424,1425,1426,1431],{},"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, ",[943,1427,1430],{"href":1428,"rel":1429},"https:\u002F\u002Fcodigoaoponto.com\u002Fferramentas\u002Fgerador-de-cpf",[947],"nosso gerador de CPF"," resolve isso rapidinho.",[15,1433,1434],{},"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.",[51,1436,1438],{"id":1437},"a-função-valida-se-o-cpf-pertence-ao-usuário","A função valida se o CPF pertence ao usuário?",[15,1440,1441],{},"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.",[15,1443,1444],{},"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.",[27,1446,1448],{"id":1447},"próximos-passos","Próximos passos",[15,1450,1451,1452,1454],{},"Agora você já tem o algoritmo do CPF e uma função ",[67,1453,1342],{}," 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.",[15,1456,1457,1458,1462],{},"Se quiser conferir valores sem escrever código, acesse ",[943,1459,1461],{"href":945,"rel":1460},[947],"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.",[1464,1465,1466],"style",{},"html pre.shiki code .s0Tla, html code.shiki .s0Tla{--shiki-default:#FF79C6}html pre.shiki code .sAOxA, html code.shiki .sAOxA{--shiki-default:#50FA7B}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .sGEwX, html code.shiki .sGEwX{--shiki-default:#FFB86C;--shiki-default-font-style:italic}html pre.shiki code .shSDL, html code.shiki .shSDL{--shiki-default:#6272A4}html pre.shiki code .s-doY, html code.shiki .s-doY{--shiki-default:#FF5555}html pre.shiki code .sIQBb, html code.shiki .sIQBb{--shiki-default:#BD93F9}html pre.shiki code .seVfx, html code.shiki .seVfx{--shiki-default:#E9F284}html pre.shiki code .smvxG, html code.shiki .smvxG{--shiki-default:#FFB86C}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s-mGx, html code.shiki .s-mGx{--shiki-default:#F1FA8C}",{"title":65,"searchDepth":232,"depth":232,"links":1468},[1469,1473,1476,1482,1489],{"id":29,"depth":232,"text":30,"children":1470},[1471,1472],{"id":53,"depth":239,"text":54},{"id":123,"depth":239,"text":124},{"id":187,"depth":232,"text":188,"children":1474},[1475],{"id":951,"depth":239,"text":952},{"id":1154,"depth":232,"text":1155,"children":1477},[1478,1479,1480,1481],{"id":1158,"depth":239,"text":1159},{"id":1220,"depth":239,"text":1221},{"id":1271,"depth":239,"text":1272},{"id":1318,"depth":239,"text":1319},{"id":1328,"depth":232,"text":1329,"children":1483},[1484,1485,1486,1487,1488],{"id":1332,"depth":239,"text":1333},{"id":1349,"depth":239,"text":1350},{"id":1408,"depth":239,"text":1409},{"id":1421,"depth":239,"text":1422},{"id":1437,"depth":239,"text":1438},{"id":1447,"depth":232,"text":1448},[203,1491],"tools","Aprenda como validar um CPF com JavaScript puro, calcular os dígitos verificadores, tratar a formatação e rejeitar sequências inválidas em formulários web.","how-to-validate-cpf-with-javascript","md",{},"\u002Fblog\u002Fcomo-validar-cpf-com-javascript","como-validar-cpf-com-javascript","2026-09-17",{"title":5,"description":1492},{"loc":1496,"lastmod":1501},"2026-10-06","blog\u002Fcomo-validar-cpf-com-javascript",1197,"HhWvxesebX_RYojibYOXfOdEj4UD7XeUxaMM7Xe7_ic",[1506,1514,1523,1530,1538,1545,1553,1560,1568,1576,1583,1589,1591,1600,1607,1614,1621,1628,1635,1643,1650,1656],{"id":1507,"path":1508,"title":1509,"articleCover":1510,"categoriesIds":1511,"publishedAt":1513},"blog\u002Fblog\u002Fa-maneira-correta-de-utilizar-a-nomenclatura-bem.md","\u002Fblog\u002Fa-maneira-correta-de-utilizar-a-nomenclatura-bem","A maneira correta de utilizar a nomenclatura BEM","\u002Fimages\u002Fblog\u002Fa-maneira-correta-de-utilizar-a-nomenclatura-bem.webp",[1512],"css","2024-05-05",{"id":1515,"path":1516,"title":1517,"articleCover":1518,"categoriesIds":1519,"publishedAt":1522},"blog\u002Fblog\u002Fcomo-adicionar-caracteres-especiais-no-i18n.md","\u002Fblog\u002Fcomo-adicionar-caracteres-especiais-no-i18n","Como Adicionar Caracteres Especiais em Traduções do i18N","\u002Fimages\u002Fblog\u002Fi18n\u002Fi18n-caracteres-especiais-no-nuxtjs-thumb.webp",[1520,1521],"nuxt","vuejs","2025-01-29",{"id":1524,"path":1525,"title":1526,"articleCover":1527,"categoriesIds":1528,"publishedAt":1529},"blog\u002Fblog\u002Fcomo-adicionar-o-google-tag-manager-no-seu-website-com-nuxt-3.md","\u002Fblog\u002Fcomo-adicionar-o-google-tag-manager-no-seu-website-com-nuxt-3","Como adicionar o Google Tag Manager no seu website com Nuxt 3","\u002Fimages\u002Fblog\u002Fcomo-adicionar-google-tag-manager-em-projeto-com-nuxt-3.webp",[1520,1521],"2024-08-15",{"id":1531,"path":1532,"title":1533,"articleCover":1534,"categoriesIds":1535,"publishedAt":1537},"blog\u002Fblog\u002Fcomo-configurar-chave-ssh-no-git-para-usar-no-github.md","\u002Fblog\u002Fcomo-configurar-chave-ssh-no-git-para-usar-no-github","Chave SSH no Git: Como Configurar chave SSH para usar no GitHub","\u002Fimages\u002Fblog\u002Fgit\u002Fcomo-criar-e-configurar-chave-ssh-no-github-thumb.webp",[1536],"git","2025-02-04",{"id":1539,"path":1540,"title":1541,"articleCover":1542,"categoriesIds":1543,"publishedAt":1544},"blog\u002Fblog\u002Fcomo-consumir-uma-api-no-javascript-com-a-fetch-api.md","\u002Fblog\u002Fcomo-consumir-uma-api-no-javascript-com-a-fetch-api","Como consumir uma API no JavaScript com a Fetch API","\u002Fimages\u002Fblog\u002Fcomo-consumir-uma-api-no-javascript-com-a-fetch-api.webp",[203],"2024-09-05",{"id":1546,"path":1547,"title":1548,"articleCover":1549,"categoriesIds":1550,"publishedAt":1552},"blog\u002Fblog\u002Fcomo-criar-dados-estruturados-com-nuxtjs.md","\u002Fblog\u002Fcomo-criar-dados-estruturados-com-nuxtjs","Como Adicionar Dados Estruturados no Nuxt.JS","\u002Fimages\u002Fblog\u002Fseo\u002Fstructured-data\u002Fstructured-data-thumb-1.webp",[1520,1521,1551],"seo","2025-01-22",{"id":1554,"path":1555,"title":1556,"articleCover":1557,"categoriesIds":1558,"publishedAt":1559},"blog\u002Fblog\u002Fcomo-funciona-o-sistema-de-rotas-no-nuxt.md","\u002Fblog\u002Fcomo-funciona-o-sistema-de-rotas-no-nuxt","Rotas no Nuxt: dinâmicas, aninhadas e catch-all","\u002Fimages\u002Fblog\u002Fnuxt\u002Fsistema-de-rotas-no-nuxtjs-thumb.webp",[1520,1521],"2025-03-12",{"id":1561,"path":1562,"title":1563,"articleCover":1564,"categoriesIds":1565,"publishedAt":1567},"blog\u002Fblog\u002Fcomo-lidar-com-inveja-de-outros-programadores.md","\u002Fblog\u002Fcomo-lidar-com-inveja-de-outros-programadores","Como Lidar com Inveja de Outros Programadores","\u002Fimages\u002Fblog\u002Fcarreira\u002Finveja-de-programadores-com-quem-se-destaca.webp",[1566],"career","2025-08-29",{"id":1569,"path":1570,"title":1571,"articleCover":1572,"categoriesIds":1573,"publishedAt":1575},"blog\u002Fblog\u002Fcomo-recuperar-arquivos-perdidos-no-git-pelo-vscode.md","\u002Fblog\u002Fcomo-recuperar-arquivos-perdidos-no-git-pelo-vscode","Perdeu arquivos no Git sem commit? Veja como recuperar pelo VS Code","\u002Fimages\u002Fblog\u002Fcomo-recuperar-arquivos-perdido-no-git-pelo-vscode.webp",[1536,1574],"vscode","2024-05-15",{"id":1577,"path":1578,"title":1579,"articleCover":1580,"categoriesIds":1581,"publishedAt":1582},"blog\u002Fblog\u002Fcomo-usar-middlewares-no-nuxtjs.md","\u002Fblog\u002Fcomo-usar-middlewares-no-nuxtjs","Middlewares: O que são e como utilizar no Nuxt.JS","\u002Fimages\u002Fblog\u002Fnuxt\u002Fmiddlewares-no-front-end.webp",[1520,1521],"2025-01-14",{"id":1584,"path":1585,"title":1586,"articleCover":1587,"categoriesIds":1588,"publishedAt":1498},"blog\u002Fblog\u002Fcomo-validar-cartao-de-credito-com-javascript.md","\u002Fblog\u002Fcomo-validar-cartao-de-credito-com-javascript","Como validar um cartão de crédito com JavaScript (algoritmo de Luhn)","\u002Fimages\u002Fblog\u002Fjavascript\u002Fcomo-validar-cartao-de-credito-com-javascript.webp",[203,1491],{"id":4,"path":1496,"title":5,"articleCover":6,"categoriesIds":1590,"publishedAt":1498},[203,1491],{"id":1592,"path":1593,"title":1594,"articleCover":1595,"categoriesIds":1596,"publishedAt":1599},"blog\u002Fblog\u002Fcomponentes-do-figma-um-guia-para-te-ajudar-a-comecar.md","\u002Fblog\u002Fcomponentes-do-figma-um-guia-para-te-ajudar-a-comecar","Guia de Componentes no Figma para Iniciantes","\u002Fimages\u002Fblog\u002Ffigma\u002Fcomponentes-do-figma-um-guia-para-te-ajudar-a-comecar.png",[1597,1598],"figma","ux","2024-10-15",{"id":1601,"path":1602,"title":1603,"articleCover":1604,"categoriesIds":1605,"publishedAt":1606},"blog\u002Fblog\u002Fhub-de-ferramentas-gratuitas-para-desenvolvedores.md","\u002Fblog\u002Fhub-de-ferramentas-gratuitas-para-desenvolvedores","Criei um Hub de Ferramentas Web Gratuitas para Devs","\u002Fimages\u002Fblog\u002Fferramentas\u002Fhub-ferramentas-gratuitas-para-desenvolvedores.webp",[1491],"2026-01-06",{"id":1608,"path":1609,"title":1610,"articleCover":1611,"categoriesIds":1612,"publishedAt":1613},"blog\u002Fblog\u002Fo-que-sao-diretivas-no-vue-e-como-implementa-las.md","\u002Fblog\u002Fo-que-sao-diretivas-no-vue-e-como-implementa-las","Diretivas no Vue 3: nativas e personalizadas","\u002Fimages\u002Fblog\u002Fvue\u002Fo-que-sao-diretivas-no-vue-e-como-implementa-las.webp",[1521],"2025-03-21",{"id":1615,"path":1616,"title":1617,"articleCover":1618,"categoriesIds":1619,"publishedAt":1620},"blog\u002Fblog\u002Fog-tags-o-que-sao-e-como-adicionar-no-seu-site.md","\u002Fblog\u002Fog-tags-o-que-sao-e-como-adicionar-no-seu-site","OG Tags: O que São e Como Adicioná-las ao Seu Site","\u002Fimages\u002Fblog\u002Fseo\u002Fo-que-e-como-utilizar-as-og-tags.webp",[1551],"2024-10-05",{"id":1622,"path":1623,"title":1624,"articleCover":1625,"categoriesIds":1626,"publishedAt":1627},"blog\u002Fblog\u002Fos-principais-erros-de-programadores-em-entrevistas-de-emprego.md","\u002Fblog\u002Fos-principais-erros-de-programadores-em-entrevistas-de-emprego","Os principais erros de programadores em entrevistas de emprego","\u002Fimages\u002Fblog\u002Fnao-cometa-esses-erros-na-sua-entrevista.webp",[1566],"2024-09-15",{"id":1629,"path":1630,"title":1631,"articleCover":1632,"categoriesIds":1633,"publishedAt":1634},"blog\u002Fblog\u002Fqual-a-diferenca-entre-a-composition-api-e-options-api-no-vuejs.md","\u002Fblog\u002Fqual-a-diferenca-entre-a-composition-api-e-options-api-no-vuejs","Qual a diferença entre a Composition API e Options API no VueJS","\u002Fimages\u002Fblog\u002Fvue\u002Fqual-a-diferenca-entre-a-composition-api-e-options-api-no-vuejs.webp",[1521],"2025-02-20",{"id":1636,"path":1637,"title":1638,"articleCover":1639,"categoriesIds":1640,"publishedAt":1642},"blog\u002Fblog\u002Fscroll-infinito-como-adicionar-ao-seu-site-e-suas-vantagens.md","\u002Fblog\u002Fscroll-infinito-como-adicionar-ao-seu-site-e-suas-vantagens","Scroll Infinito no React-Native: Guia Prático","\u002Fimages\u002Fblog\u002Freact-native\u002Fscroll-infinito-como-adicionar-ao-seu-site-e-suas-vantagens.webp",[1641],"react-native","2024-12-15",{"id":1644,"path":1645,"title":1646,"articleCover":1647,"categoriesIds":1648,"publishedAt":1649},"blog\u002Fblog\u002Fvercel-compra-nuxt-labs.md","\u002Fblog\u002Fvercel-compra-nuxt-labs","Vercel comprou a Nuxt Labs! E agora, o que muda para o Nuxt?","\u002Fimages\u002Fblog\u002Fnuxt\u002Fvercel-compra-nuxt-labs.webp",[1520],"2025-07-17",{"id":1651,"path":1652,"title":1653,"articleCover":1654,"categoriesIds":1655,"publishedAt":1501},"blog\u002Fblog\u002Fvue-vapor-mode-como-funciona-e-como-usar.md","\u002Fblog\u002Fvue-vapor-mode-como-funciona-e-como-usar","Vue Vapor Mode: o que é e o que muda no Vue 3.6","\u002Fimages\u002Fblog\u002Fvue\u002Fvue-vapor-mode-como-funciona-e-como-usar.webp",[1521,1520],{"id":1657,"path":1658,"title":1659,"articleCover":1660,"categoriesIds":1661,"publishedAt":1663},"blog\u002Fblog\u002Fweb-vitals-como-a-experiencia-do-usuario-vai-afetar-o-seo-do-seu-site.md","\u002Fblog\u002Fweb-vitals-como-a-experiencia-do-usuario-vai-afetar-o-seo-do-seu-site","Web Vitals e SEO: como a experiência do usuário afeta o seu site","\u002Fimages\u002Fblog\u002Fseo\u002Fweb-vitals\u002Fweb-vitals-como-a-experiencia-do-usuario-vai-afetar-o-seo-do-seu-site.webp",[1551,1662],"web-vitals","2024-10-25",1791682332963]