为何我的Luhn算法JavaScript代码始终返回false?求问题排查
信用卡校验代码错误分析
你的代码始终返回false,核心问题有两个,具体如下:
1. 数字处理的语法错误
在处理乘积大于9的情况时,你写了newVar = newVar[i] - 9;,这里存在明显错误:
newVar是数字类型,数字没有索引属性,newVar[i]会返回undefined- 正确的处理逻辑应该是直接用
newVar - 9(或者将数字拆分为单个数字相加,两种方式效果等价)
当newVar[i]得到undefined后,undefined - 9会变成NaN,最终cardNum会被累加为NaN,而NaN % 10的结果还是NaN,和0比较自然返回false。
2. 原数组被意外修改
Array.reverse()方法会直接修改原数组,而非返回新的反转数组。这会导致外部的valid1、invalid1数组在调用一次函数后就被反转,后续再使用这些数组时数据会不符合预期。正确的做法是先创建数组副本再反转,比如:
const reverseArray = [...Array].reverse(); // 或者 const reverseArray = Array.slice().reverse();
修正后的代码示例
const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; const validateCred = (cardArray) => { let cardNum = 0; // 创建数组副本后反转,避免修改原数组 const reverseArray = [...cardArray].reverse(); for (let i = 0; i < reverseArray.length; i++){ let currentNum = reverseArray[i]; if (i % 2 !== 0) { currentNum *= 2; // 处理大于9的情况,直接减9即可 if (currentNum > 9) { currentNum -= 9; } } cardNum += currentNum; } return cardNum % 10 === 0; } console.log(validateCred(valid1)); // 输出true console.log(validateCred(invalid1)); // 输出false
内容的提问来源于stack exchange,提问作者stullex _
相关产品推荐
相关产品推荐

