如何正确编写JavaScript回文检查器?现有代码问题如何修正?
freeCodeCamp回文检查器代码修正
现有代码的核心错误
- 预处理逻辑无效:
/\W/g.remove属于非法语法,str.toLowerCase未加括号执行调用,也没有存储处理后的结果;且\W规则无法匹配下划线_,不符合项目要求的「移除所有非字母数字字符」规则。 - 作用域与声明错误:
palindrome函数多余嵌套大括号导致作用域混乱;反转字符串时用const声明存储结果的变量,后续重新赋值会直接触发报错。 - 反转循环逻辑错误:从字符串末尾向前遍历的循环写了
i++递增规则,会直接触发死循环,无法正确生成反转后的字符串。 - 比较逻辑错误:直接将原始输入字符串和
reverseString函数本身做相等判断,既没有传入处理后的字符串调用反转函数,也没有使用预处理后的字符串做对比,判断结果完全不准。
修正后的可运行代码
function palindrome(str) { // 移除所有非字母数字字符,统一转为小写 const validStr = str.replace(/[^a-z0-9]/gi, '').toLowerCase(); // 反转处理后的字符串 let reversedStr = ''; for (let i = validStr.length - 1; i >= 0; i--) { reversedStr += validStr[i]; } // 直接返回比较结果 return validStr === reversedStr; } // 功能测试 palindrome("eye"); // 输出 true palindrome("_eye"); // 输出 true palindrome("race car"); // 输出 true palindrome("not a palindrome"); // 输出 false
关键修正点说明
- 正则使用
/[^a-z0-9]/gi匹配所有非字母、非数字的字符(包含下划线、空格、标点),配合replace方法直接移除,i修饰符忽略大小写,后续统一转小写避免大小写影响判断结果。- 存储反转结果的变量改用
let声明,允许循环中逐位拼接字符;循环条件改为i--递减,从字符串最后一位向前遍历,正确生成反转字符串。- 所有逻辑收拢在
palindrome函数内部,不需要额外嵌套独立的反转函数也能实现功能,直接返回预处理字符串和反转字符串的相等判断结果即可,不需要额外写if/else分支。
内容的提问来源于stack exchange,提问作者Photons
相关产品推荐
相关产品推荐

