JavaScript 实现身份证号码校验逻辑与代码示例

作者:异步漫步

时间:2026-10-23

浏览:118

本文详细解析了中华人民共和国居民身份证的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验证身份证号码的方法,希望能为相关开发工作提供帮助。如有任何疑问,欢迎留言交流,小编会及时回复。感谢大家对本站的支持! 如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章