JavaScript实现身份证号码校验算法详解

七月
七月
发布时间:2026-10-14 | 4人浏览过
原创

在Web开发中,确保用户输入的身份证号码合法是防止无效数据入库的关键步骤。JavaScript提供了灵活的正则表达式和字符串处理能力,可以高效地完成15位旧版身份证与18位新版身份证的格式校验及真伪验证。本文将深入解析验证算法的核心逻辑。

验证目标与核心逻辑

身份证验证通常包含四个层面的检查:

  1. 长度校验:区分15位(纯数字)和18位(前17位数字+最后一位数字或'X')。
  2. 格式校验:除最后一位外,必须全部为数字;18位身份证最后一位若为'X'需转换为大写处理。
  3. 日期校验:提取年份、月份、日期,并验证其是否为真实的日历日期(如闰年2月29日等)。
  4. 校验码校验:利用ISO 7064:1983.MOD 11-2校验码系统,通过加权因子计算最后一位是否匹配。

准备条件与常量定义

在编写验证函数前,需要定义加权因子数组和校验位映射数组。这些数据遵循国家标准GB 11643-1999。

第1步:定义校验常量

进入代码编辑器,定义以下全局常量,以便后续复用:

  • wi:加权因子数组,用于18位身份证前17位的计算。[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
  • arrVerifyCode:校验位对应表。[1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2]
  • Checker:辅助校验数组(部分实现中使用)。[1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1]

真实操作顺序:编写验证函数

第2步:执行长度与基础格式检查

首先判断输入ID的长度,并统一处理15位向18位的转换逻辑。15位身份证缺少年份的前两位(默认为19xx),需补全后参与后续校验。

var certCardValid = function(id) {
    // 长度必须为15或18
    if (id.length != 15 && id.length != 18) {
        alert("错误:身份证号共有15位或18位。");
        return false;
    }

    var ai = "";
    // 15位身份证转换为18位基准
    if (id.length == 18) {
        ai = id.substring(0, 17);
    } else {
        ai = id.slice(0, 6) + "19" + id.slice(6, 16);
    }

接着,使用正则表达式确保前17位均为数字:

    if (!/^\d+$/.test(ai)) {
        alert("错误:除最后一位外,必须为数字。");
        return false;
    }

第3步:验证日期合法性

提取年月日信息,并通过 Date 对象验证其有效性。此步骤能识别如“2023年2月30日”这样的非法日期。

    var yyyy = ai.slice(6, 10);
    var mm = ai.slice(10, 12) - 1; // 月份从0开始
    var dd = ai.slice(12, 14);
    var d = new Date(yyyy, mm, dd);

    // 验证日期是否回滚或被修正(例如输入2月30日会变成3月2日)
    if (d.getFullYear() != yyyy || d.getMonth() != mm || d.getDate() != dd) {
        alert("错误:无效日期。");
        return false;
    }

第4步:计算加权因子并比对校验码

这是最核心的算法步骤。将前17位(或15位补全后的前17位)分别乘以对应的加权因子,求和后对11取模,得到的余数即为校验位索引,最终字符应与输入的最后一位一致。

    var ret = 0;
    for (var i = 0; i < 17; i++) {
        ret += ai.charAt(i) * wi[i];
    }

    // 添加校验位到计算值
    ai += arrVerifyCode[ret % 11];
    ai = ai.toUpperCase(); // 确保末尾为'X'时大写匹配

    // 最终比对
    if (id.length == 18 && id != ai) {
        alert("错误:校验码无效。");
        return false;
    } else if (id.length == 15) {
        // 15位身份证无需比对最后校验位,只需通过上述检查即可视为格式正确
        return true;
    } else {
        return true;
    }
};

完成判断

当函数返回 true 时,表示该身份证号码符合长度、格式、日期及校验码的所有标准。如果返回 false,浏览器会弹出相应的错误提示框,指出具体是哪一部分校验失败。在实际项目中,建议将 Ext.MessageBox.alert 替换为更友好的前端UI反馈组件(如Toast或Inline Error)。

简要总结

通过上述步骤,我们构建了一个健壮的JavaScript身份证验证工具。它不仅能过滤明显的输入错误,还能通过算法验证身份证的真实性。这种前端校验策略能有效减少服务器压力,提升用户体验。需要注意的是,前端验证仅用于提升体验,后端仍应进行同样严格的二次校验以确保数据安全。

以上就是JavaScript验证身份证号完整方法的详细内容,更多关于前端数据校验的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表