` 与 `includes()` 实现大小写不敏感的垃圾信息检测)
文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载在 JavaScript 中String.prototype.includes()是大小写敏感的——直接搜索viagra永远匹配不到ViAgRA。本篇以 Modern JavaScript Tutorialen.javascript.info中字符串章节的经典练习checkSpam为例讲解如何通过大小写归一化 子串匹配两步法写出可靠的大小写不敏感检测函数并借助仓库自带的 Mocha 测试用例验证其正确性。读完本文你将掌握toLowerCase()/toUpperCase()与includes()的组合套路以及面对多关键词、单词边界等场景的扩展方案。任务需求什么是checkSpam练习原题位于仓库的 task.md要求实现一个垃圾信息检测函数编写函数checkSpam(str)当str包含viagra或XXX时返回true否则返回false。函数必须大小写不敏感。题目给出的期望行为checkSpam(buy ViAgRA now) true checkSpam(free xxxxx) true checkSpam(innocent rabbit) false注意三个关键点关键字viagra是全小写的但输入中可能出现ViAgRA这种混合大小写关键字XXX是全大写的但输入中可能出现xxxxx这种全小写形式无关文本如innocent rabbit必须被判定为安全。核心解法先统一大小写再执行子串搜索仓库中给出的官方解答位于 _js.view/solution.js完整代码如下function checkSpam(str) { let lowerStr str.toLowerCase(); return lowerStr.includes(viagra) || lowerStr.includes(xxx); }这个解法只有三行却体现了两个关键设计第一步用toLowerCase()做大小写归一化String.prototype.toLowerCase()会返回一个把所有字符转为小写的新字符串。它不修改原字符串JavaScript 中的字符串是不可变的因此需要用一个新变量lowerStr接收结果。let lowerStr str.toLowerCase();之所以先归一化是因为第二步的includes()搜索是大小写敏感的。在父章节 字符串教程 中对此有明确说明str.includes(substr)严格区分大小写例如Widget.includes(widget)会返回false。如果不做归一化buy ViAgRA now.includes(viagra)会因V与v的差异而返回false直接漏判。统一转成小写后无论输入是ViAgRA、VIAGRA还是viagra在lowerStr中都会变成viagra从而被可靠命中。第二步用includes()做布尔子串匹配return lowerStr.includes(viagra) || lowerStr.includes(xxx);includes()返回true/false语义上只关心有没有、不关心位置正好契合检测类函数的返回值需求。这一点与indexOf()形成对比indexOf()返回的是匹配位置找不到返回-1在if判断中容易踩坑——当匹配出现在字符串开头时indexOf()返回0而0会被当作假值。两个关键字用逻辑或||连接只要命中任意一个函数即返回true两者都未命中返回false。完整可运行示例原解答solution.md附带了一组可直接运行的演示function checkSpam(str) { let lowerStr str.toLowerCase(); return lowerStr.includes(viagra) || lowerStr.includes(xxx); } alert( checkSpam(buy ViAgRA now) ); // true alert( checkSpam(free xxxxx) ); // true alert( checkSpam(innocent rabbit) ); // false备选思路正则表达式方案除了小写化 子串匹配检测大小写不敏感的关键字还有一个经典思路——正则表达式利用i修饰符ignoreCase让匹配忽略大小写function checkSpam(str) { return /viagra|xxx/i.test(str); }两种方案的取舍如下小写化 includes()思路直白、零正则语法负担适合作为初学者的首选也便于后续把关键词抽取成数组循环判断正则 i标志写法更紧凑且可以通过\b单词边界进一步控制匹配粒度见下文扩展。两种方案在本题场景下结果一致。仓库官方答案选用前者说明它希望读者优先掌握toLowerCase()与includes()这两个字符串基础 API 的组合用法。边界情况与设计取舍一个看似简单的三行函数在实际使用时仍有几个值得注意的边界1. 部分匹配误报includes()做的是子串匹配而非单词匹配。例如checkSpam(free xxxxx) // true命中 xxxfree xxxxx小写化后包含连续五个x其中任意一段xxx都会被命中这正是题目期望的行为。但反过来像auxxxiliary这类单词中恰好包含关键字片段的输入也会被判定为 spam。如果业务上要求整词才命中就需要正则的\b单词边界function checkSpam(str) { return /\b(viagra|xxx)\b/i.test(str); }注意\b会改变匹配语义例如free xxxxx中的xxx前后仍是x无法匹配边界从而返回false。这属于业务口径差异需按实际需求取舍。2. 空字符串与特殊输入空字符串.toLowerCase()仍为空字符串includes()均返回false函数安全返回false含数字、标点等非字母字符toLowerCase()对它们原样保留不影响子串搜索非字符串类型原解答未做类型校验若传入null/undefined会抛出TypeError。生产环境如需健壮性可先做String(str)转换或类型断言但题目范围内不做要求。3. 为什么关键字统一用小写归一化目标是让待检测文本与关键字处于同一大小写基准。官方答案把两个关键字都写成小写viagra、xxx与toLowerCase()的结果保持一致。如果反过来用toUpperCase()关键字就都应写成大写VIAGRA、XXX——思路等价选择其一即可。用仓库自带测试验证实现本练习的目录结构_js.view里还带了一份基于 BDD 风格的测试文件 test.js与 Modern JavaScript Tutorial 中 Mocha 自动化测试章节 介绍的describe/it/assert体系一脉相承describe(checkSpam, function() { it(finds spam in buy ViAgRA now, function() { assert.isTrue(checkSpam(buy ViAgRA now)); }); it(finds spam in free xxxxx, function() { assert.isTrue(checkSpam(free xxxxx)); }); it(no spam in innocent rabbit, function() { assert.isFalse(checkSpam(innocent rabbit)); }); });三个用例恰好覆盖了题目要求的三类场景用例输入预期验证点用例 1buy ViAgRA nowtrue混合大小写仍能命中viagra用例 2free xxxxxtrue全小写形式命中关键字xxx用例 3innocent rabbitfalse无关文本不误报这组测试本身就是对实现的事实约束只要checkSpam通过上述断言就说明大小写归一化 子串匹配的组合在题目定义的输入空间内是正确且完备的。扩展将关键词抽取为可配置列表三行版写死了两个关键字。若需支持更多关键词或动态配置可把关键字抽成数组配合some()实现同等语义const SPAM_WORDS [viagra, xxx]; function checkSpam(str) { const lowerStr str.toLowerCase(); return SPAM_WORDS.some(word lowerStr.includes(word)); } checkSpam(buy ViAgRA now); // true checkSpam(free xxxxx); // true checkSpam(innocent rabbit); // false这段代码与官方解答在核心机制上完全一致先toLowerCase()再逐个includes()只是把关键字集合从硬编码的||表达式变成了可维护的数据结构方便后续增删规则。值得说明的是这只是基于原解答模式的自然延伸仓库中并未提供该版本如需在真实项目落地还应结合黑名单管理与误报率评估做进一步设计。小结checkSpam是理解大小写不敏感搜索的经典范例其核心方法论可以概括为两步归一化用str.toLowerCase()或toUpperCase()把文本与关键字对齐到同一大小写基准——这是绕开includes()大小写敏感特性的关键匹配用includes()返回布尔值配合||或多关键词时的some()完成检测返回true/false。配套的 test.js 以true/false双断言锁定了函数契约使这一实现具备可回归验证的工程价值。后续若需精确控制整词匹配或支持 Unicode 语义可在此基础上引入正则i标志与\b边界相关字符串搜索 API 的完整讲解可回溯到 字符串章节 的 Searching for a substring 小节。赞分享文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐Modern JavaScript Tutorial 任务实战用 JavaScript 编写 min(a, b) 求两数最小值Modern JavaScript Tutorial 任务实战用 JavaScript 编写 min a, b 求两数最小值 本篇文章围绕《Modern Ja文档/教程前端用 Go 标签语句与循环实现 Word Finderlearngo 大小写不敏感检索与 PATH 路径搜索实战用 Go 标签语句与循环实现 Word Finderlearngo 大小写不敏感检索与 PATH 路径搜索实战 导读 Word Finder 是 13 loo示例工程教程用环境变量实现 minigrep 大小写不敏感搜索从 TDD 测试到 env::var 实战用环境变量实现 minigrep 大小写不敏感搜索从 TDD 测试到 env::var 实战 环境变量是命令行工具最常用的配置通道之一用户只需在终端会话中设教程文档上一篇jQuery Mobile查看用户设备分布按钮设计最佳实践下一篇如何利用PyTorch3D实现人体运动分析3D姿态跟踪与行为识别完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考