JavaScript简易密码加密问题:仅输出首个加密字符,求排查
问题分析与解决方案
兄弟,我一眼就发现问题所在了——你的return encryptedPassword;语句放错位置啦!它被写在了外层的for循环内部,这就导致函数在处理完密码的第一个字符后,直接就返回结果了,后面的字符根本没机会进入循环处理,自然只能输出加密后的首个字符。
错误根源
看这段代码的核心结构:
for (var i=0; i < password.length; i++){ // ... 单个字符的加密逻辑 return encryptedPassword; // 这里是坑!循环第一次执行就直接终止函数 }
外层循环本应该遍历密码的每一个字符,但每次循环到最后都触发了return,函数直接终止,后续的循环迭代完全没机会执行。
修正后的代码
只需要把return encryptedPassword;移到外层for循环的外面,让循环完整遍历所有字符后再返回最终结果:
function crypto(){ var password = "Pizza2Day"; var flag = 0; var encryptedPassword= ""; var originalValues = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; var encryptedValues = ["m", "h","t","f","g","k","b","p","j","w","e","r","q","s","l","n","i","u","o","x","z","y","v","d","c","a"]; for (var i=0; i < password.length; i++){ flag=0; for (var r = 0; r < originalValues.length; r++){ if (originalValues[r] == password.charAt(i)){ encryptedPassword += encryptedValues[r]; flag = 1; break; } else if (originalValues[r].toUpperCase() == password.charAt(i)) { encryptedPassword += encryptedValues[r].toUpperCase(); flag = 1; break; } } if (flag == 0) { encryptedPassword += password.charAt(i); } } return encryptedPassword; // 移到循环外面,等所有字符处理完再返回 } console.log("New Password: " + crypto());
现在运行代码,就能得到完整的加密密码了。
额外优化建议
你现在用双重循环查找字符,效率有点低,其实可以把字符映射做成一个对象,这样查找速度更快,代码也更简洁:
function crypto(){ var password = "Pizza2Day"; var encryptedPassword= ""; // 直接创建小写字符的映射对象,查找效率从O(n)提升到O(1) const charMap = { 'a':'m', 'b':'h', 'c':'t', 'd':'f', 'e':'g', 'f':'k', 'g':'b', 'h':'p', 'i':'j', 'j':'w', 'k':'e', 'l':'r', 'm':'q', 'n':'s', 'o':'l', 'p':'n', 'q':'i', 'r':'u', 's':'o', 't':'x', 'u':'z', 'v':'y', 'w':'v', 'x':'d', 'y':'c', 'z':'a' }; for (var i=0; i < password.length; i++){ const char = password.charAt(i); const lowerChar = char.toLowerCase(); // 检查字符是否在映射表中 if (charMap.hasOwnProperty(lowerChar)) { // 根据原字符的大小写返回对应加密结果 encryptedPassword += char === lowerChar ? charMap[lowerChar] : charMap[lowerChar].toUpperCase(); } else { // 非字母字符直接保留 encryptedPassword += char; } } return encryptedPassword; } console.log("New Password: " + crypto());
内容的提问来源于stack exchange,提问作者Sock Monkey
相关产品推荐
相关产品推荐

