身份证号码的有效性校验
根据GB11643-1999的标准,对18位身份证进行有效性校验。
定义
在18位身份证中,身份证的前17位成为本体码 master number,第18位成为校验码 check number,根GB11643-1999的算法,由身份证号码的前17位,即可计算出第18位----校验码的值,从而对该身份证号码的有效性进行判断。
/**
* @desc 根据GB11643-1999校验身份证号码的有效性
* @param {string} idCard 18位身份证号码
*/
export function isValidCitizenIdNumber(idCard) {
idCard = idCard
.trim()
.replace(/\ +/g, '')
.replace(/[\r\n]/g, '');
if (idCard.length !== 18) return false;
/** 公民身份证号码中各个位置上的加权因子Wi数值 */
const wList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
/** 各个位置取模(%11)后,各个值对应的校验码字符 */
const aList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
/**
* @desc 本体17位的ai * Wi的值列表
* @type {Array<number>}
*/
const awList = new Array(17).fill(0);
for (let i = 0; i < 17; i++) {
if (isNaN(Number(idCard[i]))) return false;
awList[i] = Number(idCard[i]) * wList[i];
}
/** 身份证本体的级数之和 */
const sum = awList.reduce((prev, curr) => prev + curr);
/** 第18位/校验码的值 0-10 */
const m = sum % 11;
// 根据m获得第18位的正确值,然后进行校验,返回校验结果
return aList[m] === idCard[17];
}