// 校验身份证号
const oncheck = (idCard) => {
const regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; // 正则表达式
if (regIdCard.test(idCard)) {
if (idCard.length === 18) {
const idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
let idCardWiSum = 0;
for (let i = 0; i < 17; i += 1) {
idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];
}
const idCardMod = idCardWiSum % 11;
const idCardLast = idCard.substring(17); // 得到最后一位身份证号码
// 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
if (idCardMod === 2) {
if (idCardLast === 'X' || idCardLast === 'x') {
console.log('检验成功');
} else {
console.log('检验失败');
}
} else if (idCardLast === idCardY[idCardMod].toString()) {
// 请仔细阅读下面的特别注意
console.log('检验成功');
} else {
console.log('检验失败');
}
}
} else {
console.log('检验失败');
}
};
特别注意:
这里的idCardY[idCardMod]是数值型,idCardLast 是字符串,这个时候需要类型转换,不然得到的结果永远都是false,我是直接在网上找的算法,发现都有这个问题,这也是我找了一早上才找到原因!!!