JavaScript中keyCode在if块外可正常打印 块内取数位返回undefined
问题原因
你生成的keyCode是Number数值类型,既不是字符串也不是数组,直接用[索引]写法访问数位拿到的永远是undefined,和代码写在if块内外没有关系:你在if块外只是打印了keyCode变量本身,没有尝试按下标取数位,所以看起来输出正常。
你日志里打印的
unidentified是拼写偏差,实际拿到的就是undefined:可以直接在控制台执行const test = 69097; console.log(test[0])验证,输出就是undefined,数值和undefined做加法运算自然得到NaN。
修复方法
二选一即可:
- 方法1(实现更简单):生成密钥时直接转成字符串,取数位时转回数字参与计算
首先修改getKeyCode函数,同时补前导零避免随机数小于10000时密钥长度不足5位的问题:
然后修改计算密文索引的逻辑,把取到的字符串数位转成数字:function getKeyCode() { keyCode = Math.floor(Math.random() * 100000).toString().padStart(5, '0') console.log(keyCode) };cMO1 = lTBC + Number(keyCode[lKIO]) - 方法2:保留
keyCode为数字类型,每次通过数学运算取对应数位的值,不需要做类型转换:// 取密钥从左到右第lKIO位的数值 const currentKeyBit = Math.floor(keyCode / Math.pow(10, 4 - lKIO)) % 10 cMO1 = lTBC + currentKeyBit
其他待修复的潜在问题
- 越界判断逻辑错误:字母表数组
abc长度为26,合法索引范围是0~25,判断条件应该写为if (cMO1 >= abc.length),现有逻辑用>会出现cMO1等于26时取不到对应字符的问题 - 字符匹配逻辑鲁棒性差:当前逻辑只支持全小写字母,传入大写字母、数字、符号、空格时,
lTBC会持续自增超出数组长度也匹配不到对应字符,直接进入死循环 - 函数入参未生效:
cypher函数声明了入参string,但内部实际读取的是全局变量message,后续传入其他待加密字符串时不会生效
内容的提问来源于stack exchange,提问作者oas333
相关产品推荐
相关产品推荐

