JS实现ShiftCipher移位密码时第一个if语句无法跳过问题求助
问题原因分析
- 第一个if判断逻辑完全错误
你写的判断条件newStr.charCodeAt(i) > 97 || newStr.charCodeAt(i) < 122属于永真式:任何数值都必然满足「大于97」或「小于122」其中一个条件,比如你测试输入的<Unicode值为60,满足小于122的条件,数字3的Unicode值为51,也满足小于122的条件,所以所有字符都会进入第一个if分支,永远走不到你用来处理非字母字符的else分支。
同时你的边界判断错误:小写a的Unicode是97,小写z的Unicode是122,你用>97和<122会直接把a和z两个字母排除在加密逻辑外。 - 冗余逻辑错误
你代码中extraNum += newStrArry.push(96+extraNum);存在逻辑问题:Array.push()的返回值是push操作后数组的新长度,你把这个长度加到extraNum上属于完全多余的无效操作,不会影响最终结果但会产生无用计算。
修正方案
把第一个if的判断条件调整为:只有字符是小写字母(Unicode在97~122闭区间)时才进入加密逻辑,否则直接存原值,同时提前把charCode存为变量避免重复计算,修正后的代码如下:
class ShiftCipher{ constructor(shift){ this._shift = shift; } encrypt(str){ let newStr = str.toLowerCase(); let strArr = []; let newStrArry = []; let bigArr = [strArr, newStrArry] for(let i = 0; i < newStr.length; i++){ const code = newStr.charCodeAt(i); strArr.push(code); // 只有小写a-z才做移位处理 if(code >= 97 && code <= 122) { const shifted = code + this._shift; if(shifted > 122){ const extraNum = shifted - 122; newStrArry.push(96 + extraNum); console.log('a'); } else { newStrArry.push(shifted); console.log('b'); console.log(newStr[i]); } } else { // 非小写字母直接存原值 newStrArry.push(code); console.log('c'); } } return bigArr; } } const mySymbol = new ShiftCipher(4); console.log(mySymbol.encrypt('<3')); // 输出的newStrArry会正确保留60和51两个原始Unicode值
内容的提问来源于stack exchange,提问作者Wyatt G. Railey
相关产品推荐
相关产品推荐

