js 身份证校验 发表于 2019-08-16 | 更新于: 2022-12-25 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1] // 加权因子let letideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2] // 身份证验证位值.10代表Xfunction IdCardletidate (idCard) { idCard = trim(idCard.replace(/ /g, '')) // 去掉字符串头尾空格 if (idCard.length === 15) { return isletidityBrithBy15IdCard(idCard) // 进行15位身份证的验证 } else if (idCard.length === 18) { let aIdCard = idCard.split('') // 得到身份证数组 if (isletidityBrithBy18IdCard(idCard) && isTrueletidateCodeBy18IdCard(aIdCard)) { // 进行18位身份证的基本验证和第18位的验证 return true } else { return false } } else { return false }}/** * 判断身份证号码为18位时最后的验证位是否正确 * @param aIdCard 身份证号码数组 * @return */function isTrueletidateCodeBy18IdCard (aIdCard) { let sum = 0 // 声明加权求和变量 if (aIdCard[17].toLowerCase() === 'x') { aIdCard[17] = 10 // 将最后位为x的验证码替换为10方便后续操作 } for (let i = 0; i < 17; i++) { sum += Wi[i] * aIdCard[i] // 加权求和 } let CodePosition = sum % 11 // 得到验证码所位置 if (aIdCard[17] === letideCode[CodePosition]) { return true } else { return false }}/** * 验证18位数身份证号码中的生日是否是有效生日 * @param idCard 18位书身份证字符串 * @return */function isletidityBrithBy18IdCard (idCard18) { let year = idCard18.substring(6, 10) let month = idCard18.substring(10, 12) let day = idCard18.substring(12, 14) let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day)) // 这里用getFullYear()获取年份,避免千年虫问题 if (tempDate.getFullYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) { return false } else { return true }}/** * 验证15位数身份证号码中的生日是否是有效生日 * @param idCard15 15位书身份证字符串 * @return */function isletidityBrithBy15IdCard (idCard15) { let year = idCard15.substring(6, 8) let month = idCard15.substring(8, 10) let day = idCard15.substring(10, 12) let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day)) // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 if (tempDate.getYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) { return false } else { return true }}// 去掉字符串头尾空格function trim (str) { return str.replace(/(^\s*)|(\s*$)/g, '')}export default IdCardletidate