JavaScript密码生成器输入长度与实际输出字符数不符问题求解
问题根因
- 特殊字符集
keyListSpec被定义为空字符串,该分支拼接字符的逻辑完全无效,你设置的lenSpec位长度全部丢失,这是4位输入仅得到3位密码的核心原因 - 密码初始固定赋值为
@,提前占用1位长度,后续长度计算逻辑没有和这个初始位对齐,逻辑混乱 - 从输入框拿到的
value是字符串类型,未做数值转换就传入生成函数,存在隐式类型转换风险
具体复现(以输入4位为例)
- 初始密码
password = '@',已有1位长度 len = Math.ceil(4/2) -1 = 1,第一层循环运行1次,拼接1个字母+1个数字,总长度变为3lenSpec = 4 - 2*1 = 2,第二层循环要补2位,但keyListSpec为空,charAt任何索引都返回空字符串,补位完全失效,最终总长度只有3
修复方案
调整长度计算逻辑,补充特殊字符集,同时把输入值转成数值:
修复后的JS代码
function generirajLozinku(pLength) { // 先转成数值,避免字符串传入导致计算错误 pLength = Number(pLength); var keyListAlpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", keyListInt = "123456789", keyListSpec = "!@#$%^&*()", // 不需要特殊字符可以删掉这行和后续相关逻辑 password = ''; // 去掉初始固定的@,避免额外占用长度 // 重写长度分配逻辑,保证最终长度和输入一致 var lenAlpha = Math.floor(pLength / 2); var lenInt = Math.floor(pLength / 2); var lenSpec = pLength - lenAlpha - lenInt; for (let i = 0; i < lenAlpha; i++) { password += keyListAlpha.charAt(Math.floor(Math.random() * keyListAlpha.length)); } for (let i = 0; i < lenInt; i++) { password += keyListInt.charAt(Math.floor(Math.random() * keyListInt.length)); } for (let i = 0; i < lenSpec; i++) { password += keyListSpec.charAt(Math.floor(Math.random() * keyListSpec.length)); } // 打乱字符顺序 password = password.split('').sort(function() { return 0.5 - Math.random() }).join(''); return password; } function myFunction() { // 输入值转成数字再传入 var x = Number(document.getElementById("num").value); document.getElementById("demo2").innerText = generirajLozinku(x); }
如果不需要特殊字符,直接删掉keyListSpec相关逻辑,把lenInt设为pLength - lenAlpha即可。
内容的提问来源于stack exchange,提问作者Sebweb
相关产品推荐
相关产品推荐

