JavaScript实现凯撒密码代码无报错但不终止、运行异常
凯撒密码解码器代码问题修复
你的代码存在2个核心错误,导致无法输出正确结果:
- 存在低级笔误:循环终止条件里写的是
word.legth,字符串长度的正确属性名是word.length,漏写了字母n。访问不存在的对象属性会返回undefined,和数字比较时undefined会被转为NaN,所有和NaN的比较结果均为false,循环逻辑直接失效。 - 区间判断写法错误:JavaScript不支持
a <= b <= c形式的连续比较。该写法会先计算左侧a <= b得到布尔值true或false,再将布尔值转为数字(true转1,false转0)后和右侧的c比较,永远无法实现判断字符编码落在指定区间的效果,所有字符都会被错误归类到大写字母分支,偏移计算完全错误。
修复后可正常运行的代码
let word = "привет"; let shift = 3; let result = ""; // 修正length拼写错误 for (let i = 0; i < word.length; i++){ const charCode = word[i].charCodeAt(0); // 用逻辑与&&连接两个判断条件,实现区间校验 if ('А'.charCodeAt(0) <= charCode && charCode <= 'Я'.charCodeAt(0)) { let newChar = ((charCode + shift - 'А'.charCodeAt(0)) % 32) + 'А'.charCodeAt(0) result += String.fromCharCode(newChar); } else if ('а'.charCodeAt(0) <= charCode && charCode <= 'я'.charCodeAt(0)) { let newChar = ((charCode + shift - 'а'.charCodeAt(0)) % 32) + 'а'.charCodeAt(0) result += String.fromCharCode(newChar); } else { result += word[i]; } } console.log(result)
运行上述代码,输入привет、偏移3时会正确输出тулезх。如果需要支持字母ё/Ё的偏移,额外加分支单独判断这两个字符的编码即可。
内容的提问来源于stack exchange,提问作者make-me-fly
相关产品推荐
相关产品推荐

