JavaScript生成含大写、特殊字符密码时while循环运行异常问题排查
代码问题分析
- 正则表达式逻辑错误:
你定义的capital正则/ABCDEFGHIJKLMNOPQRSTUVWXYZ/是匹配连续的完整大写字母序列,不是判断是否存在任意一个大写字母;special正则里的$、-属于正则特殊字符,未做转义也会导致匹配逻辑失效。正确的正则应该使用字符集语法包裹:大写匹配用/[A-Z]/,特殊字符匹配用/[#$!\-_]/。 - return位置错误:
return语句放在了while循环内部,第一次生成12位密码后不管是否符合校验规则,都会直接返回结果,while的校验逻辑完全没有生效。 - 密码生成逻辑缺陷:
假如第一次生成的密码不符合要求,进入第二次while循环时没有清空pass变量,会在原有12位字符基础上继续拼接,最终密码长度会超出12位的预期。 - 变量作用域问题:
拼接密码的for循环中,索引变量i没有使用let声明,会泄露为全局变量,污染全局作用域。
修复后完整代码
const characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#$!-_"; const capital = /[A-Z]/; const special = /[#$!\-_]/; function PWord (){ let pass = "" while(!(capital.test(pass) && special.test(pass)) ){ // 每次循环先重置密码为空 pass = "" for (let i=0; i<=11; i++) { let rand_char = characters.charAt(Math.floor(Math.random()*characters.length)); pass = pass + rand_char; } } // 校验通过后再返回 return pass } for(let i=0;i<=3;i++){ let ps = PWord(); console.log("Password" + (i+1) + ":" + ps); }
内容的提问来源于stack exchange,提问作者gldN379
相关产品推荐
相关产品推荐

