JavaScript 如何校验身份证
在做用户注册、信息提交这类网页功能时,我们经常会碰到需要用户填写身份证号的场景——毕竟身份证是国内最通用的身份凭证。但如果直接把用户输入的内容存进系统,很容易混入数字、位数不对的无效号码,甚至是故意填的假号码。这时用JavaScript做校验,就能快速过滤掉大部分错误。
先搞懂身份证的基础规则
要写对校验逻辑,得先知道身份证的“硬性标准”。国内现在用的身份证都是18位(老的15位已经停用,不用考虑),由3部分组成:前6位是出生地的行政区划代码,中间8位是出生年月日,最后4位里,第17位是性别(男奇女偶),最后1位是校验码——这部分是防止号码被随意编造的关键。

举个生活化的例子:就像学校的学号,有的同学学号包含年级、班级、序号,最后可能有校验位,避免有人乱写序号。身份证的最后1位校验码,也是这个作用,不是随便写的。
第一步:先做最基础的格式校验
先筛掉一眼错的内容,这是最容易实现的部分。比如用户输入的内容,不能有字母、符号,只能是数字,而且必须刚好18位。
举个场景:用户在注册页填完身份证,不小心多打了一个空格,或者把最后一位写成了X(这里要注意,X是允许的,它代表数字10,是罗马数字的写法,很多人不知道这点,容易误拦),这时基础校验就要兼顾:仅允许数字和大写X,总长度18位。
代码里的逻辑大概是:先判断输入的长度是不是18,再检查除了最后一位外,是不是全是数字,最后一位如果是X也没问题,其他字母就不行。这一步就能过滤掉80%的错误,比如填了15位老号码、少打一位、乱加符号的情况。
第二步:校验出生日期的有效性
基础格式过了,还要看中间8位的出生年月日是不是合理。比如有人填“19000230”,2月根本没有30天;或者“20230229”,2023年不是闰年,2月也没29号;甚至填“18000101”这种早于身份证实施年份(1985年)的日期,都是无效的。
这里可以用当前时间做简单限制,比如出生年份不能比当前年份大,也不能太小(比如低于1900),同时要验证月份(1-12)、日期(对应月份的天数),遇到2月还要判断当年是不是闰年,这就是刚才说的“学校学号里的真实年级”,避免有人填不存在的出生信息。
第三步:用校验码做最终验证
这是身份证校验里最核心的部分,也是最容易被忽略的。最后一位校验码不是随便生成的,有一套固定算法:把前17位数字分别乘以对应的权重系数,加起来后除以11,得到的余数对应一个校验码表,余数0对应1,1对应0,2对应X,以此类推。
举个简单的数学例子:假设前17位是11010119900101123,先给每一位乘上对应的权重(比如第一位乘7,第二位乘9,第三位乘10……以此类推),把所有乘积加起来得到总和,总和除以11取余数,得到的数字对应最后一位应该是什么,和用户输入的最后一位对比,一致才是有效号码。
如果最后一位是X,也要转成对应的“10”来计算,不能直接和字符对比。这一步能过滤掉前两步没发现的、靠瞎编凑够18位的假号码,是防止恶意提交的关键。
实际用的时候要注意的小细节
很多人容易踩的坑:一是把最后一位的小写x当成错误拦掉,其实应该转成大写X;二是15位老身份证的问题,现在基本不用了,但如果系统要兼容,需要把15位转成18位再校验;三是不要用网上的“身份证生成器”来做合法校验,那个只能生成符合格式的假号,过不了校验码这一步。
总结下来,JavaScript校验身份证的逻辑,就是从“一眼错的格式”到“合理的出生日期”,再到“唯一的校验码”,一步步筛选,既能保证用户信息的准确性,又能减少无效数据给系统带来的麻烦。