教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载Luhn 算法Luhn Algorithm是一种轻量级的校验和公式被广泛用于验证各类标识符号码的合法性例如信用卡卡号、IMEI 号码国际移动设备识别码、NPI美国国家提供者标识符等。本文基于 30-seconds-of-code 项目中的 luhn-check.md 文档逐步拆解该算法在 JavaScript 中的纯函数式实现并深入讲解每一步的数组方法原理、边界情况与实战注意事项帮助读者在表单校验、支付信息预处理等场景中直接落地使用。Luhn 算法是什么为什么需要它Luhn 算法诞生于 1954 年由 IBM 科学家 Hans Peter Luhn 提出。它本质上是一个mod-10 校验算法通过对号码的每一位数字执行一套固定的运算最终得到一个校验和如果该校验和能被10整除则号码在结构上是合法的。它最典型的应用场景包括信用卡卡号各大支付网络的卡号Visa、MasterCard 等末尾都包含一位由 Luhn 算法推导出的校验位IMEI 号码每台手机设备的国际移动设备识别码NPI 号码美国医疗行业使用的国家提供者标识符各类需要防呆的序列号、会员号、优惠码等。需要特别强调的是Luhn 算法只能检测单点录入错误如某位数字输错和绝大多数相邻数字调换它不能证明号码真实存在、也不包含任何加密或安全性保证——但它足以在早期快速拦截明显无效的输入避免在后续步骤中浪费网络请求与处理资源。算法的核心规则从右向左看号码时Luhn 算法的规则可以概括为四步从右往左从倒数第二位开始将处于偶数位置索引从 0 计数时对应奇数索引的每一位数字乘以 2如果加倍后的结果大于 9则将其减去 9等价于把两位数拆开逐位相加例如16 → 1 6 7将所有数字包括未加倍的位与最后一位校验位求和若总和能被 10 整除则号码通过校验。逐步实现从号码到数字数组在 luhn-check.md 给出的实现中第一步是把输入号码转换成一个数字数组。这里使用了一条典型的 ES6 链式调用const arr ${num} .split() .reverse() .map(x Number.parseInt(x));逐个拆解模板字符串${num}先把输入可能是字符串或数字统一转成字符串。这样函数既能接收4485275742308327这样的字符串也能接收6011329933655299这样的数字字面量String.prototype.split()把字符串按空字符切分得到字符数组如[4, 4, 8, ...]Array.prototype.reverse()反转数组使算法可以从**最右侧最后一位**开始处理——这是 Luhn 算法从右往左规则的前提Array.prototype.map(x Number.parseInt(x))将每个字符转换为数字得到纯数字数组。这一号码 → 数字数组的思路与项目中的 digitize-number.md 一脉相承——后者还额外使用Math.abs()处理了负数输入并展示了Number.parseInt(i, 10)显式指定十进制基数的写法作为代码健壮性的参考。提取校验位与累加求和拿到反转后的数字数组后算法进入核心计算阶段。由于 Luhn 规则中最后一位是校验位不参与加倍因此先把它单独取出const lastDigit arr.shift();Array.prototype.shift()会移除并返回数组的第一个元素——在反转后的数组中它恰好就是原始号码的最后一位。紧接着用Array.prototype.reduce()对剩余数字一次性完成偶数位加倍、奇数位原样相加的迭代let sum arr.reduce( (acc, val, i) i % 2 ! 0 ? acc val : acc ((val * 2) 9 ? val - 9 : val), 0 );这里reduce回调的三个参数含义如下参数含义在本算法中的作用acc累加器保存到目前为止的数字总和初始值为0val当前元素当前正在处理的数字位i当前索引用于判断当前位是否需要加倍索引判断逻辑i % 2 ! 0索引为奇数数字原样累加。由于数组已被反转这对应原始号码中从右数、位于偶数位置的数字索引为偶数执行(val * 2) 9 ? val - 9 : val——先让val自乘 2若结果大于 9 则减去 9即两位数字逐位相加的等价写法否则直接使用加倍后的值。最后把之前取出的校验位加回总和并做mod-10 判断sum lastDigit; return sum % 10 0;完整实现与测试用例将以上步骤组合即得到 luhn-check.md 中的完整函数const luhnCheck num { const arr ${num} .split() .reverse() .map(x Number.parseInt(x)); const lastDigit arr.shift(); let sum arr.reduce( (acc, val, i) i % 2 ! 0 ? acc val : acc ((val * 2) 9 ? val - 9 : val), 0 ); sum lastDigit; return sum % 10 0; }; luhnCheck(4485275742308327); // true luhnCheck(6011329933655299); // true luhnCheck(123456789); // false三个测试用例分别覆盖了两种输入形态与一个反例4485275742308327字符串形式的合法卡号→true6011329933655299数字字面量形式的合法卡号→true123456789明显不合法的短号码→false。边界情况与输入注意事项虽然该实现短小精悍但在实际业务接入时仍有一些值得注意的边界情况输入形态函数通过模板字符串自动兼容字符串与数字两种输入但如果传入的是null、undefined或带小数点的浮点数如1234.5模板字符串会将其转换为null、undefined、1234.5导致Number.parseInt解析出NaN进而使结果不可预期。建议在调用前先做类型与格式校验显式基数Number.parseInt(x)未显式传基数参数时默认按十进制推断对于纯数字字符串是安全的如需更严格的语义可参考项目中 digitize-number.md 的写法改为Number.parseInt(i, 10)返回语义函数返回布尔值true/false适合直接接入表单校验、支付信息预处理等判定逻辑。如果需要更严格的数值输入校验可以组合项目中的 number-validation.md——它通过Number.isNaN()、Number.isFinite()与Number(n) n组合判断能有效拦截NaN、Infinity与隐式类型转换异常。与掩码处理的组合实战Luhn 校验最常见的落地场景之一是支付信息展示先用 Luhn 算法确认卡号结构合法再对卡号做脱敏处理再展示。项目中的 mask-string.md 提供了一行式掩码实现const mask (cc, num 4, mask *) ${cc}.slice(-num).padStart(${cc}.length, mask); mask(1234567890); // ******7890它利用String.prototype.slice()保留末尾若干位、再用String.prototype.padStart()填充掩码字符。将luhnCheck与mask组合即可在收银台、订单详情等界面实现合法校验 安全展示的完整链路。学习资源定位需要说明的是本项目将算法类实现定位为学习资源而非生产级方案。这一点在 algorithm.yaml 的集合描述中明确提到算法类实现primarily a learning resource, as they might already be implemented natively or require optimizations to run in production算法实现主要作为学习资源因为相关能力可能已有原生实现或需要针对生产环境做优化。因此在生产环境中如果只需要判断一个号码是否通过 Luhn 校验可以考虑是否引入成熟的校验库而阅读本文的价值在于真正理解校验和的推导过程、数组方法链的组合方式以及校验类算法与表单验证、数据脱敏等前端工程实践的衔接方法。小结通过 luhn-check.md 的实现我们可以清晰地看到一条完整的函数式编程路径字符串化 → 切分 → 反转 → 数字化 → 提取校验位 → 归约求和 → 模 10 判定。整个函数只依赖原生字符串与数组 API不引入任何依赖既是对 Luhn 算法原理的直观呈现也是一份值得反复研读的 ES6 数组方法实战样例。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐告别手动校验3分钟用Go实现Luhn算法验证身份证/信用卡号告别手动校验3分钟用Go实现Luhn算法验证身份证/信用卡号 你是否还在为校验用户输入的银行卡号、身份证号是否有效而烦恼手动核对容易出错编写复杂验证逻辑又示例工程终极指南如何用Luhn算法轻松验证信用卡号终极指南如何用Luhn算法轻松验证信用卡号 在现代金融交易中信用卡号的验证是保障安全的重要环节。Luhn算法作为一种简单高效的校验方法被广泛应用于信用卡、示例工程Gemma-4-12B-coder-fable5-composer2.5-MTP-NVFP4安全部署如何添加自定义防护机制Gemma 4 12B coder fable5 composer2.5 MTP NVFP4安全部署如何添加自定义防护机制 Gemma 4 12B coder上一篇ProxyPool路线图未来功能规划与社区贡献指南下一篇Memtest86技术解析从内存故障诊断到系统稳定性测试的实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考