You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:54:03