# DEMO {#demo}
做表单验证的时候,经常会遇到身份证号码验证,下面就简单总结下基本方法。
# 身份证18位分别代表的含义 {#身份证18位分别代表的含义}
- 1-2 省级行政区代码
- 3-4 地级行政区划分代码
- 5-6 县区行政区分代码
- 7-14 出生年、月、日
- 15-17 顺序码,同一地区同年、同月、同日出生人的编号,奇数是男性,偶数是女性
- 18 校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示
# 验证方法 {#验证方法}
- 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2
- 将这17位数字和系数相乘的结果相加求和
- 用加出来和除以11,取得余数
- 余数只可能为0到10这11个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2
# 具体实现 {#具体实现}
function validIdCard(cardNo) {
if (!cardNo || cardNo.length !== 18) {
return false
}
// 17位数字本体码权重
const w = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
// mod11,对应校验码字符值
const v = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
let sum = 0
for(let i = 0;i < 17;i++) {
sum += cardNo.charAt(i) * w[i]
}
return cardNo.charAt(17).toUpperCase() === v[sum % 11]
}