JS密码生成器生成结果为undefined问题排查求助
解决密码生成器返回
undefined的问题 嘿,我帮你找出了几个导致密码生成结果始终是undefined的核心问题,咱们一步步来修复:
问题1:randomFunc函数缺少return语句
你看,在randomFunc里,只有hasUpper分支写了return,其他三个分支(小写、数字、符号)只调用了生成字符的函数,但没有把结果返回出去。这会导致这些分支执行时,randomFunc默认返回undefined。
修复方法:给每个if分支补上return:
function randomFunc(input) { if (input === "hasUpper") { console.log("upper"); return getRandomUpper(); } if (input === "hasLower") { console.log("lower") return getRandomLower(); // 新增return } if (input === "hasNumbers") { console.log("numbers") return getRandomNumber(); // 新增return } if (input === "hasSymbols") { console.log("symbols") return getRandomSymbol(); // 新增return } }
问题2:生成密码时是覆盖而非追加字符
在generatePassword的循环里,你用了generatedPassword = randomFunc(funcName);——这会每次把之前生成的字符全部覆盖掉,而不是把新字符追加到后面。如果最后一次调用randomFunc返回undefined,最终结果自然就是undefined。
修复方法:把赋值改成追加(+=):
generatedPassword += randomFunc(funcName);
问题3:未初始化的选项变量导致逻辑错误
如果用户输入的不是yes(比如no或者直接点了取消),hasUpper、hasLower这些变量就不会被定义,会变成undefined。在计算typesCount的时候,undefined + true这类运算会得到NaN,直接打乱后续逻辑。
修复方法:先把所有选项变量初始化为false,再根据用户输入修改:
// 先初始化所有选项为false var hasUpper = false; var hasLower = false; var hasNumbers = false; var hasSymbols = false; // 用可选链避免用户取消prompt时的报错 if (upperCase?.toLowerCase() === 'yes') { hasUpper = true; console.log("upper: " + hasUpper); } if (lowerCase?.toLowerCase() === 'yes') { hasLower = true; console.log("lower: " + hasLower); } if (numbers?.toLowerCase() === 'yes') { hasNumbers = true; console.log("number: " + hasNumbers); } if (symbols?.toLowerCase() === 'yes') { hasSymbols = true; console.log("symbol: " + hasSymbols); }
问题4:无效长度的处理漏洞
如果用户输入的长度不符合要求,length会被设为false,但点击生成按钮时依然会执行生成逻辑,导致循环异常。
修复方法:在点击事件里先判断长度是否有效:
generateEl.addEventListener('click', function() { if (!length) { alert("Invalid Password length"); return; } resultEl.innerText = generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length); console.log("generatebut"); });
完整修复后的代码
我还额外加了两个小优化:过滤未选中的字符类型、判断无选中类型时的提示,避免生成空密码或无效字符。
JavaScript代码
//Password option input const resultEl = document.getElementById("result"); var characters = prompt("How many characters should the password contain (8-128)"); var upperCase = prompt("Should the password contain uppercase Letters?"); var lowerCase = prompt("Should the password contain lowercase Letters"); var numbers = prompt("Should the password contain numbers?"); var symbols = prompt("Should the password contain symbols?"); var generateEl = document.getElementById("generate"); // 初始化所有选项为false var hasUpper = false; var hasLower = false; var hasNumbers = false; var hasSymbols = false; // 根据用户输入更新选项 if (upperCase?.toLowerCase() === 'yes') { hasUpper = true; console.log("upper: " + hasUpper); } if (lowerCase?.toLowerCase() === 'yes') { hasLower = true; console.log("lower: " + hasLower); } if (numbers?.toLowerCase() === 'yes') { hasNumbers = true; console.log("number: " + hasNumbers); } if (symbols?.toLowerCase() === 'yes') { hasSymbols = true; console.log("symbol: " + hasSymbols); } // 处理密码长度 var length = false; if (characters > 7 && characters < 129) { length = parseInt(characters, 10); console.log("length: " + length); } else { alert("Invalid Password length"); } function randomFunc(input) { if (input === "hasUpper") { console.log("upper"); return getRandomUpper(); } if (input === "hasLower") { console.log("lower") return getRandomLower(); } if (input === "hasNumbers") { console.log("numbers") return getRandomNumber(); } if (input === "hasSymbols") { console.log("symbols") return getRandomSymbol(); } } generateEl.addEventListener('click', function() { if (!length) { alert("Invalid Password length"); return; } resultEl.innerText = generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length); console.log("generatebut"); }); //Generate password function function generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length) { let generatedPassword = ''; const typesCount = hasUpper + hasLower + hasNumbers + hasSymbols; // 没有选中任何字符类型时的提示 if (typesCount === 0) { alert("Please select at least one character type"); return ''; } // 过滤掉未选中的类型,避免生成无效字符 const typesArr = [{ hasUpper }, { hasLower }, { hasNumbers }, { hasSymbols }].filter(item => Object.values(item)[0]); for (let i = 0; i < length; ) { typesArr.forEach(function(type) { // 防止最终密码长度超出用户设置的数值 if (i >= length) return; const funcName = Object.keys(type)[0]; generatedPassword += randomFunc(funcName); i++; }); } console.log("password: " + generatedPassword); return generatedPassword; } // Password generator functions function getRandomLower() { return String.fromCharCode(Math.floor(Math.random() * 26) + 97); } function getRandomUpper() { return String.fromCharCode(Math.floor(Math.random() * 26) + 65); } function getRandomNumber() { return String.fromCharCode(Math.floor(Math.random() * 10) + 48); } function getRandomSymbol() { const symbols = "!@#$%^&*()<>?," return symbols[Math.floor(Math.random() * symbols.length)]; }
HTML代码
<main class="container"> <header> <h1 class="title">Password Generator</h1> </header> <section class="generator-box"> <h2 class="sub-title">Generate a Password</h2> <div class="pass-div pass-hold"> <h3>Your secure Password</h3> <span id="result"></span> </div> <section class="button-div"> <button class="button" id="generate">Generate</button> </section> </section> </main>
内容的提问来源于stack exchange,提问作者WoahTesting
相关产品推荐
相关产品推荐

