如何修复JavaScript中凯撒密码+大小写反转的密码哈希函数错误
问题修复方案
你代码的问题和嵌套函数无关,主要存在三处核心逻辑错误:
错误原因
- 外层字符类型判断逻辑错误:
password的每个字符都是字符串类型,typeof password[i] === typeof str的判断永远为真,数字字符永远不会进入你写的数字处理分支,这是你得到错误返回值的核心原因。 shift函数大小写判断错误:if (char.toUpperCase(text[i]))会永远返回真,所有字母都会按照大写ASCII规则计算移位,小写字母移位结果完全错误,同时result变量未声明属于隐式全局变量,可能引发变量污染。- 数字处理逻辑错误:就算进入数字分支,字符串类型的数字直接和
x相加会做字符串拼接而非数值计算,结果不符合预期。
修复后代码
function hashPassword(password, x) { // password is a string, x is a number // return a string // (ex. password = 'ab1By', x = 3 so it should return "DE4eB") function shift(text, s) { let result = ""; // 补全变量声明 for (let i = 0; i < text.length; i++) { let char = text[i]; // 修改大小写判断逻辑 if (char === char.toUpperCase()) { let ch = String.fromCharCode((char.charCodeAt(0) + s - 65) % 26 + 65); result += ch; } else { let ch = String.fromCharCode((char.charCodeAt(0) + s - 97) % 26 + 97); result += ch; } } return result; } function reversecase(x) { var output = ''; for (var i = 0, len = x.length; i < len; i++) { var character = x[i]; if (character == character.toLowerCase()) { output = output + character.toUpperCase(); } else { output = output + character.toLowerCase(); } } return output } var result = ""; for (var i = 0; i < password.length; i++) { let curChar = password[i]; // 修改字符类型判断逻辑,用正则判断是否为字母 if (/[a-zA-Z]/.test(curChar)) { let char = shift(curChar, x) let charcode = reversecase(char) result += charcode; } else { // 字符串数字先转数值再做加法 let num = Number(curChar) + x let number = num % 10 result += number.toString() } } return result }; console.log(hashPassword("abcd4321", 4)) // 输出 EFGH8765
说明
按你给出的示例ab1By+偏移3返回DE4eB的逻辑,数字是做加偏移处理,所以abcd4321加偏移4的正确输出是EFGH8765,如果你需要的是数字减偏移,可以把数字处理部分的加法改成减法即可匹配你说的EFGH7654预期。
内容的提问来源于stack exchange,提问作者Davon Mike
相关产品推荐
相关产品推荐

