JavaScript ·

JavaScript验证身份证号码

JavaScript验证身份证号码

1、15位居民身份证号码转为18位保证可以通过位数验证

/**
 * 15位转18位身份证号
 * @param obj
 * @returns {string|*}
 */
function changeFivteenToEighteen(obj) {
  if (obj.length === 15) {
    let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
    let arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
    let cardTemp = 0
    let k
    obj = obj.substr(0, 6) + '19' + obj.substr(6, obj.length - 6)
    for (k = 0; k < 17; k++) {
      cardTemp += obj.substr(k, 1) * arrInt[k]
    }
    obj += arrCh[cardTemp % 11]
    return obj
  }
  return obj
}

2、传入居民身份证号码,通过算法进行验证,居民身份证号码介绍及其算法

/**
 * 验证身份证号码
 * @param num
 * @returns {boolean}
 */
export function isIdNumber(num) {
  // 15位和18位身份证号码的正则表达式
  let regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[X])$)$/;
  // 如果通过该验证,说明身份证格式正确,但准确性还需计算
  if (regIdCard.test(num)) {
    if (num.length === 15) {
      num = changeFivteenToEighteen(num)
    }
    if (num.length === 18) {
      let idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 将前17位加权因子保存在数组里
      let idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后,可能产生的11位余数、验证码,也保存成数组
      let idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和
      for (let i = 0; i < 17; i++) {
        idCardWiSum += num.substring(i, i + 1) * idCardWi[i];
      }
      let idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置
      let idCardLast = num.substring(17); // 得到最后一位身份证号码
      // 如果等于2,则说明校验码是10,身份证号码最后一位应该是X
      if (idCardMod === 2) {
        return idCardLast == "X";
      } else {
        // 用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
        return idCardLast == idCardY[idCardMod];
      }
    }
  } else {
    return false;
  }
}