编写移位量为8的凯撒密码JS函数,为何设置了空格判断分支仍无法保留输出空格?
现有代码的核心错误点
- 空格判断逻辑完全失效,导致空格被错误替换
你当前的执行顺序是:先通过alphabetArray.indexOf(当前字符)拿到索引,再从字母数组里按索引取currentCharacter用于判断是否为空格。但空格本身不在字母数组内,indexOf(' ')返回-1,此时alphabetArray[-1]为undefined,永远无法匹配currentCharacter == ' '的判断分支。
更严重的是:这个场景下newIndex = -1 + 8 =7,对应字母数组里的'H',原本的空格会被错误替换成'H',而非原样保留,最终表现为输出里没有正常的空格分隔。 - 移位逻辑没有做取模回绕,导致靠后的字母被丢弃
字母数组长度为26,你直接对字母索引加8,当原字母索引超过18(比如S、T、Z这类靠后的字母),加8后的索引会超出数组最大长度25,对应的shiftedCharacter为undefined,这类字母会被直接丢弃,不符合凯撒密码的循环移位规则。 - 字符类型判断顺序颠倒
正确的处理逻辑应该是先判断当前遍历到的字符属于哪类(空格/有效字母/特殊符号),再做移位计算;而你是先做索引移位计算,再判断结果,从根源上容易引入错判。 - 循环变量未声明
循环中使用的i没有通过let/var声明,会泄漏为全局变量,长期运行可能引发意外的逻辑冲突,但这不是当前空格丢失问题的核心诱因。
修正后符合规则的实现代码
function shift8(string){ // 统一转大写,兼容输入大小写、满足全大写输出要求 string = string.toUpperCase(); const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const FIXED_SHIFT = 8; let shiftedString = ''; for (let i = 0; i < string.length; i++) { const currentChar = string[i]; // 规则要求:空格原样保留 if (currentChar === ' ') { shiftedString += ' '; continue; } // 规则要求:非字母类特殊符号直接过滤丢弃 if (!alphabet.includes(currentChar)) { continue; } // 移位计算,对26取模实现超过Z后回绕到A开头的效果 const originalIndex = alphabet.indexOf(currentChar); const newIndex = (originalIndex + FIXED_SHIFT) % 26; shiftedString += alphabet[newIndex]; } return shiftedString; } // 测试输入 var output = shift8('The quick brown fox jumps over the lazy dog'); console.log(output);
内容的提问来源于stack exchange,提问作者Aaryan Khadka
相关产品推荐
相关产品推荐

