JavaScript生成随机密码

密码要求

必须包含数字、大、小写字母、特殊符号的字符串

知识点

  • Math.random()随机生成[0, 1)之间的浮点数。
  • Math.floor(Math.random() * number)(number >= 0),随机生成一个区间在[0, number)的数字,包括0不包括number。
  • JavaScript Array 的基础。Array.map()、Array.fill()、Array.sort()
  • ECMAScript语法。
  • String.fromCharCode()
  • ASCII码,A(65)a(97)

简单模式(元素可见,浅显易懂)

const generatePassword = () => {
  const numbers = '0123456789';
  const letters = 'abcdefghijklmnopqrstuvwxyz';
  const capital = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const special = '!@#$%&*';

  const arr1 = Array(4).fill(0).map(() => numbers[Math.floor(Math.random() * numbers.length)]);
  const arr2 = Array(4).fill(0).map(() => letters[Math.floor(Math.random() * letters.length)]);
  const arr3 = Array(4).fill(0).map(() => capital[Math.floor(Math.random() * capital.length)]);
  const arr4 = Array(2).fill(0).map(() => special[Math.floor(Math.random() * special.length)]);

  return [...arr1, ...arr2, ...arr3, ...arr4].sort(() => Math.random() - 0.5).join('');
};

console.log(generatePassword()); // "PkwtIFL!j1410$"

复杂模式(防御性代码)

const generatePassword = () => {
  const special = '@$!%*?&#';
  const arr1 = Array(2).fill(0).map(() => special[Math.floor(Math.random() * special.length)]);

  const numberFn = (length, min) => Math.floor(Math.random() * length) + min;
  const letterFn = cb => (length, min) => String.fromCharCode(cb(length, min));

  const letters = Array(4).fill(letterFn(numberFn));
  const numbers = Array(4).fill(numberFn);

  const arr2 = letters.map(cb => cb(25, 65)).concat(letters?.map(cb => cb(25, 97))).concat(numbers.map(cb => cb(10, 0)));
  return [...arr1, ...arr2].sort(() => Math.random() - 0.5).join('');
};

console.log(generatePassword()); // "P3L$u92u&t0MjM"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容