JavaScript密码生成器无法生成用户指定长度密码问题求助
JavaScript密码生成器Bug修复方案
核心错误点
- 多规则判断逻辑错误
你使用了连续else if做规则匹配,只要第一个规则(是否包含特殊符号)为真,后续所有多规则组合的判断都会直接跳过,永远只能拿到第一个符合的单一字符池,而且你用+=拼接数组会触发隐式类型转换,把数组转成字符串拼接,不符合预期。 - 密码生成循环逻辑错误
循环内每次都重新声明password变量并直接赋值为单个随机字符,等于每次循环都覆盖之前的结果,循环结束后只会保留最后一次生成的1位字符。 - 边界判断遗漏
未选任何生成规则的分支没有大括号包裹,即使触发提示也会继续执行后续逻辑,导致字符池为空。
修复代码
仅需要修改generatePassword函数即可正常运行:
function generatePassword() { let password = ""; let passwordChar = []; // 初始化空数组存储可选字符池 // 密码长度校验 while (true) { passwordLength = parseInt(prompt("选择密码长度,需介于8-128之间")); if (passwordLength >= 8 && passwordLength <= 128) { break; } alert("请输入8-128之间的有效数字"); } // 规则确认 symbols = confirm("点击OK确认包含特殊符号"); numbers = confirm("点击OK确认包含数字"); uppercase = confirm("点击OK确认包含大写字母"); lowercase = confirm("点击OK确认包含小写字母"); // 拼接字符池,符合条件就合并对应数组,无需写大量冗余判断 if (symbols) passwordChar = passwordChar.concat(sym); if (numbers) passwordChar = passwordChar.concat(num); if (uppercase) passwordChar = passwordChar.concat(upper); if (lowercase) passwordChar = passwordChar.concat(lower); // 未选任何规则的异常处理 if (passwordChar.length === 0) { alert("你至少需要选择一种字符规则,请重新操作"); return ""; } // 循环生成密码,拼接字符而非覆盖原有值 for (var i = 0; i < passwordLength; i++) { password += passwordChar[Math.floor(Math.random() * passwordChar.length)] } return password; }
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

