JavaScript 实现身份证号码校验逻辑与代码示例
本文详细解析了中华人民共和国居民身份证的18位编码结构,包括地址码、出生日期码、顺序码及校验码的计算规则。重点介绍了基于ISO 7064:1983.MOD 11-2标准的校验算法,并提供了一段完整的JavaScript函数代码,用于在前端表单中验证身份证号码的合法性与格式。
身份证验证背景与编码结构概述
在涉及身份信息的Web表单开发中,前端输入验证是确保数据准确性的关键环节。本文整理了一套基于JavaScript的身份证号码验证方案,旨在帮助开发者快速实现这一功能。在编写具体代码前,有必要先梳理中国大陆居民身份证的编码规范。
身份证号码的构成遵循严格的结构标准:
- 该号码属于特征组合码,由17位数字本体码和1位校验码共同组成。
- 从左至右的排列顺序依次为:6位数字地址码,紧接着是8位数字出生日期码,
- 随后是3位数字顺序码,最后是1位数字校验码。
地址码、出生日期码与顺序码解析
关于地址码部分:
该部分代表编码对象常住户口所在县(市、旗、区)的行政区划代码,其执行标准遵循GB/T2260。
关于出生日期码部分:
该部分表示编码对象出生的年、月、日,执行标准为GB/T7408。需要注意的是,年、月、日代码之间不使用分隔符直接连接。
关于顺序码部分:
该部分表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。其中,奇数分配给男性,偶数分配给女性。
关于校验码部分:
该码是根据前面17位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
校验码计算算法详解
具体的计算步骤如下:
1. 将身份证号码前17位数字分别乘以对应的系数。从第1位到第17位的系数依次为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。 2. 将这17位数字与对应系数相乘的结果相加,得到总和。 3. 用该总和除以11,计算余数。 4. 余数的可能取值范围是0到10,共11个数字。 5. 余数与身份证最后一位号码的对应关系如下:0对应1,1对应0,2对应X,3对应9,4对应8,5对应7,6对应6,7对应5,8对应4,9对应3,10对应2。 例如,若计算得出的余数为3,则身份证第18位数字应为9;若对应数字为2(即余数为2),则身份证最后一位号码为罗马数字X。
身份证号码验证实例分析
以下以一个男性身份证号码53010219200508011x为例,验证其合法性:
首先我们得出前17位的乘积和[(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)]是189,
接着用总和189除以11,得到189/11=17……2,即余数为2。
最后根据对应规则,余数2对应的检验码为X。因此,可以判定这是一个合法的身份证号码。
JavaScript验证函数实现
基于上述规则和计算方法,我们可以封装一个JavaScript验证函数,具体实现如下:
const validateIdCard = function (idcard) {
// 判断如果传入的不是一个字符串,则转换成字符串
idcard = typeof idcard === 'string' ? idcard : String(idcard);
//正则表达式验证号码的结构
let regx = /^[\d]{17}[0-9|X|x]{1}$/;
if (regx.test(idcard)) {
// 验证前面17位数字,首先定义前面17位系数
let sevenTeenIndex = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 截取参数前17位
let front_seventeen = idcard.slice(0, 17);
// 截取第18位
let eighteen = idcard.slice(17, 18);
// 这里如果是X要转换成小写,如果是数字在这里是字符串类型,则转换成数字类型,好做判断
eighteen = isNaN(parseInt(eighteen)) ? eighteen.toLowerCase() : parseInt(eighteen);
// 定义一个变量计算系数乘积之和余数
let remainder = 0;
//利用循环计算前17位数与系数乘积并添加到一个数组中
// charAt()类似数组的访问下标一样,访问单个字符串的元素,返回的是一个字符串因此要转换成数字
for (let i = 0; i < 17; i++) {
remainder = (remainder += parseInt(front_seventeen.charAt(i)) * sevenTeenIndex[i]) % 11;
}
//余数对应数字数组
let remainderKeyArr = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
// 取得余数对应的值
let remainderKey = remainderKeyArr[remainder] === 'X' ? remainderKeyArr[remainder].toLowerCase() : remainderKeyArr[remainder];
console.log(remainderKey);
console.log(eighteen)
// 如果最后一位数字对应上了余数所对应的值,则验证合格,否则不合格,
// 由于不确定最后一个数字是否是大小写的X,所以还是都转换成小写进行判断
if (eighteen === remainderKey) {
return idcard;
} else {
console.log('你输入的身份证号码格式不对!')
}
} else {
console.log('你输入的身份证号码格式不对,请重新输入!')
}
}
//函数调用
validateIdCard('53010219200508011x');//验证合格
总结
以上介绍了使用JavaScript验证身份证号码的方法,希望能为相关开发工作提供帮助。如有任何疑问,欢迎留言交流,小编会及时回复。感谢大家对本站的支持! 如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
