JavaScript回文数检测函数异常,数组相等却返回false求解
问题原因及修复方案
核心问题1:数组的==比较逻辑不对
JavaScript里数组属于引用类型,用==比较时,只会检查两个数组是不是同一个内存对象,不会对比数组内的元素内容。哪怕两个数组元素完全一致,只要是独立创建的,==都会返回false。比如:
const arr1 = ['1','2','3']; const arr2 = ['1','2','3']; console.log(arr1 == arr2); // 输出false
核心问题2:reverse()是原地修改方法
你代码里两次调用了array2.reverse():
- 第一次
console.log(array2.reverse()):reverse()直接修改了array2本身,把它从['3','2','1']变成['1','2','3'],所以控制台能看到两个数组都是['1','2','3']。 - 第二次
return array1 == array2.reverse():这时候array2被再次反转,变回了['3','2','1']。
这时候你拿array1(['1','2','3'])和反转后的array2(['3','2','1'])做引用比较,结果自然是false。
修复代码示例
方法1:转字符串比较
把两个数组转成字符串后再对比,直接验证内容是否一致:
function luckyNumber(value) { let array = String(value).split(''); let array1 = array.slice(0, array.length / 2); let array2 = array.slice(array.length / 2, array.length); if (array2.length > array1.length) { array2.shift(); } // 创建反转副本,不修改原数组 const reversedArray2 = [...array2].reverse(); console.log(array1); console.log(reversedArray2); return array1.join('') === reversedArray2.join(''); } console.log(luckyNumber(1234321)); // 输出true
方法2:遍历元素逐一对比
更严谨的方式是逐个检查数组元素:
function luckyNumber(value) { let array = String(value).split(''); let array1 = array.slice(0, array.length / 2); let array2 = array.slice(array.length / 2, array.length); if (array2.length > array1.length) { array2.shift(); } const reversedArray2 = [...array2].reverse(); console.log(array1); console.log(reversedArray2); // 长度不等直接返回false if (array1.length !== reversedArray2.length) return false; // 遍历对比每个元素 for (let i = 0; i < array1.length; i++) { if (array1[i] !== reversedArray2[i]) return false; } return true; } console.log(luckyNumber(1234321)); // 输出true
内容的提问来源于stack exchange,提问作者Oto
相关产品推荐
相关产品推荐

