zhangxinxu/quiz

JS基础测试45期

Opened this issue · 10 comments

请写一个JS方法,可以随机生成4位的验证码字符,由数字和字母随机组成,字母都是大写;

例如: AZ88,7MM2, 2323,Z990等。


大家提交回答的时候,注意缩进距离,起始位置从左边缘开始;另外,github自带代码高亮,所以请使用下面示意的格式(1积分)。

```js
// 你的JS代码写在这里
 ```

本期小测会以要点形式进行回复。

  var getVerifyCode = (function(){
    let list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    return function (len = 4) {
      let code = ''
      for(var i = 0; i < len; i++) {
        let idx = ((Math.random() * 36) | 0)
        code = code + list[idx]
      }
      return code
    }
  }())

const randomStr = (len) => Math.random().toString(36).substring(2).toUpperCase().substr(0,len)

  • 方法一
function createVerifyCode() {
    return Math.random().toString(36).substring(2).substring(0, 4).toUpperCase();
}
  • 方法二
function getRandom() {
    var verifyCode = ""
    var num = parseInt(Math.random() * 90, 10) + 48;
    if (num >= 48 && num <= 57) {
        verifyCode = String.fromCharCode(num);
    } else if (num >= 65 && num <= 90) {
        verifyCode = String.fromCharCode(num);
    } else {
        return getRandom();
    }
    return verifyCode;
}

function createVerifyCode2() {
    //48-57 65-90
    var verifyCode = ""
    for (var i = 0; i < 4; i++) {
        verifyCode += getRandom();
    }
    return verifyCode;
}
const getVerifyCode=()=>Math.random().toString(36).substr(2,4).toUpperCase()
function randomVerify(len){
  let str = ""
  let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

  for (let i = 0; i < len; i++) {
    pos = Math.round(Math.random() * (arr.length - 1))
    str += arr[pos]
  }
  return str
}

console.log(randomVerify(4))
const codeList = range(48, 57).concat(range(65, 90)) // A-Z0-9之间的utf16编码(48-57为0-9,65-90为A-Z)
const codeLen = codeList.length

/**
 * 返回[a, b]范围的整数
 * @param {number} a 开始值
 * @param {number} b 结束值
 */
function range (a, b) {
  let res = []
  for (let i = a; i <= b; i++) {
    res.push(i)
  }
  return res
}

/**
 * 获取一个随机的验证字符utf16编码
 */
function getRandomCode () {
  const idx = Math.floor(Math.random() * codeLen)
  return codeList[idx]
}

/**
 * 返回一个给定长度的随机验证字符串
 * @param {number} len 验证字符串长度
 */
function getRandomCodeText (len = 4) {
  let list = new Array(len).fill(0).map(() => getRandomCode())
  return String.fromCharCode(...list) // 将utf16编码转为字符串
}

console.log(getRandomCodeText())
zy017 commented
function getRandom(len = 4) {
    let min = 0
    let max = parseInt("z".repeat(len), 36)
    let n = Math.floor(Math.random() * (max - min + 1)) + min
    return n.toString(36).toUpperCase().padStart(len, "0")
}

console.log(getRandom(4))
function getVerificationCode(num) {
  let res = "";
  for (let i = 0; i < num; ++i) {
    const value = ((Math.random() * 36) >> 0).toString(36).toUpperCase();
    res += value;
  }
  return res;
}
console.log(getVerificationCode(4));

不错的方法示意:
Math.random().toString(36).slice(-4).toUpperCase()

有不少小伙伴实现都很不错。

获取 unicode 随机数字然后转换成对应字符

function getCode(num) {
  var code = "";
  var codeA = "A".charCodeAt(0);
  var code0 = "0".charCodeAt(0);
  var getOneCode = function () {
    var randNum = Math.floor(Math.random() * 36);
    // 大于9表示是字母
    var charCode = (randNum > 9 ? codeA - 10 : code0) + randNum;
    return String.fromCharCode(charCode);
  };
  // 循环num次
  for (var i = num; i--; ) {
    code += getOneCode();
  }
  return code;
}
console.log(getCode(4));