相关文章推荐
勤奋的雪糕  ·  mysql_request plugin ...·  3 周前    · 
首发于 我的专栏
一行代码生成随机字符串

一行代码生成随机字符串

之前在项目中有一个生成32位随机字符串的需求,一个比较平凡(二逼)的实现方式如下:

首先生成一个包含 a-z,A-Z, 0-9 的集合

const genStrSet = () => {
  let strSet = new Set();
  for (let i = 65; i <= 90; i++) {
    strSet.add(String.fromCharCode(i));
  for (let i = 48; i <= 57; i++) {
    strSet.add(String.fromCharCode(i));
  for (let i = 97; i <= 122; i++) {
    strSet.add(String.fromCharCode(i));
  const result = Array.from(strSet.entries()).map(e => e[0]);
  console.log(result);
  return result;
const strSet = genStrSet(); 

生成的 strSet 的值如下

然后从中随机抽取 32 位字符

((strSet)=>{
  let str = ''
  for(let i = 0; i < 32; i++){
    const charIndex = Math.floor(Math.random() * strSet.length)
    str += strSet[charIndex]
  console.log(str) // the random code !!
})(strSet)

结果如下

好了...谢谢观看



















既然你看到了这里,说明你有在认真看我的文章

没错,身为一个前端工程师师决定不能容忍那么丑陋的代码存在于项目中的,那我们有没有什么改进的方案呢?

在上面的例子里,为了获取随机字符,我们还特地生成了一张字符表,实际上这是没有必要的。因为我们其实可以用 toString 方式来获取这些字符。

看一下 MDN 上关于 Number.prototype.toString() 的介绍

有上面的文档可以知道,Number.prototype.toString() 还能接收一个额外的可选参数 radix, 它可以用来定义改 Number 对象需要解析的数制,默认是十进制。

而我们知道,在36进制中,大于10的数字是依次用 a,b,c ... z 来表示的,如下面这段代码:

(10).toString(36) //  a
(11).toString(36) //  b