FreeCodeCamp回文校验器挑战代码所有用例均返回true问题排查
回文校验器代码错误原因及修复方案
你写的代码存在两处核心逻辑错误,导致所有测试用例都返回true:
- 非字母数字字符过滤逻辑完全失效
你使用str[i] === /[^0-9a-z]/gi判断字符是否为非字母数字,这是把字符串直接和正则对象本身做相等比较,该判断永远返回false,所以过滤逻辑全程没有执行,所有特殊字符、空格都被保留了下来。
就算判断逻辑写对,你先把字符push进数组再调用splice(str[i], 1)删除的逻辑也不对:splice第一个参数需要传要删除元素的索引,你传了字符本身作为索引,根本找不到对应元素,无法完成删除。 - 数组反转和比较逻辑错误
首先let strArrRev = strArr属于引用赋值,两个变量指向内存中的同一个数组,调用reverse()方法会直接修改原数组,所以strArr和strArrRev永远是同一个数组,用===比较当然永远返回true。
另外JS中数组属于引用类型,就算两个不同数组的内容完全一致,用===比较也会返回false,你需要先把数组转成字符串再做内容比较。
正确的实现代码如下:
function palindrome(str) { // 转小写 + 过滤所有非字母数字字符 const cleanedStr = str.toLowerCase().replace(/[^0-9a-z]/gi, ''); // 反转后和原字符串比较 const reversedStr = cleanedStr.split('').reverse().join(''); return cleanedStr === reversedStr; }
内容的提问来源于stack exchange,提问作者Kynan
相关产品推荐
相关产品推荐

