编辑代码

// 身份证校验 加强校验
function checkIDCard(code) {
  // 校验非空
  if (!code) {
    return false
  }
  // 校验长度
  if (code.length != 15 && code.length != 18) {
    return false
  }
  // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
  //假设18位身份证号码:41000119910101123X  410001 19910101 123X
  //^开头
  //[1-9] 第一位1-9中的一个      4
  //\\d{5} 五位数字           10001(前六位省市县地区)
  //(18|19|20)                19(现阶段可能取值范围18xx-20xx年)
  //\\d{2}                    91(年份)
  //((0[1-9])|(10|11|12))     01(月份)
  //(([0-2][1-9])|10|20|30|31)01(日期)
  //\\d{3} 三位数字            123(第十七位奇数代表男,偶数代表女)
  //[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
  //$结尾

  //假设15位身份证号码:410001910101123  410001 910101 123
  //^开头
  //[1-9] 第一位1-9中的一个      4
  //\\d{5} 五位数字           10001(前六位省市县地区)
  //\\d{2}                    91(年份)
  //((0[1-9])|(10|11|12))     01(月份)
  //(([0-2][1-9])|10|20|30|31)01(日期)
  //\\d{3} 三位数字            123(第十五位奇数代表男,偶数代表女),15位身份证不含X
  //$结尾
  
  var reg = new RegExp(/(^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/)
  var matches = reg.test(code)
  if (matches) {
    // 15位的身份证,直接返回合法
    if (code.length == 15) {
      return true
    }
    // 18位的进一步校验
    try {
      // 身份证号拆分字符数组
      var charArray = code.split('')
      // 前十七位加权因子
      var idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
      // 这是除以11后,可能产生的11位余数对应的验证码
      var idCardY = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
      var sum = 0
      for (var i = 0; i < idCardWi.length; i++) {
          // 当前身份证字符
          var current = charArray[i]
          // 当前值 = 当前身份证字符 * 当前加权因子
          var count = current * idCardWi[i]
          // 总和累加
          sum += count
      }
      var idCardLast = charArray[17]
      var idCardMod = sum % 11
      // 对比总和除以11的余数对应的验证码时候和身份证最后一位相同
      return idCardY[idCardMod].toUpperCase() == idCardLast.toUpperCase()
      
    } catch(e) {
      console.error(e)
      return false
    }
    
  }
  return matches
}

let code = '41000119910101123X'
console.log(checkIDCard(code))