You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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 _

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:45:21