密码要求
必须包含数字、大、小写字母、特殊符号的字符串
知识点
-
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"