js 身份证校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]    // 加权因子
let letideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2] // 身份证验证位值.10代表X
function IdCardletidate (idCard) {
idCard = trim(idCard.replace(/ /g, '')) // 去掉字符串头尾空格
if (idCard.length === 15) {
return isletidityBrithBy15IdCard(idCard) // 进行15位身份证的验证
} else if (idCard.length === 18) {
let aIdCard = idCard.split('') // 得到身份证数组
if (isletidityBrithBy18IdCard(idCard) && isTrueletidateCodeBy18IdCard(aIdCard)) { // 进行18位身份证的基本验证和第18位的验证
return true
} else {
return false
}
} else {
return false
}
}
/**
* 判断身份证号码为18位时最后的验证位是否正确
* @param aIdCard 身份证号码数组
* @return
*/
function isTrueletidateCodeBy18IdCard (aIdCard) {
let sum = 0 // 声明加权求和变量
if (aIdCard[17].toLowerCase() === 'x') {
aIdCard[17] = 10 // 将最后位为x的验证码替换为10方便后续操作
}
for (let i = 0; i < 17; i++) {
sum += Wi[i] * aIdCard[i] // 加权求和
}
let CodePosition = sum % 11 // 得到验证码所位置
if (aIdCard[17] === letideCode[CodePosition]) {
return true
} else {
return false
}
}
/**
* 验证18位数身份证号码中的生日是否是有效生日
* @param idCard 18位书身份证字符串
* @return
*/
function isletidityBrithBy18IdCard (idCard18) {
let year = idCard18.substring(6, 10)
let month = idCard18.substring(10, 12)
let day = idCard18.substring(12, 14)
let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
// 这里用getFullYear()获取年份,避免千年虫问题
if (tempDate.getFullYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
return false
} else {
return true
}
}
/**
* 验证15位数身份证号码中的生日是否是有效生日
* @param idCard15 15位书身份证字符串
* @return
*/
function isletidityBrithBy15IdCard (idCard15) {
let year = idCard15.substring(6, 8)
let month = idCard15.substring(8, 10)
let day = idCard15.substring(10, 12)
let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
if (tempDate.getYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
return false
} else {
return true
}
}
// 去掉字符串头尾空格
function trim (str) {
return str.replace(/(^\s*)|(\s*$)/g, '')
}

export default IdCardletidate