“这个字符串包含那个词吗?”——困扰每个初学者的难题
你在编写脚本、接收服务器响应或只是过滤城市列表。突然之间,你陷入了困境:如何在 JavaScript 中检查字符串是否包含特定的子字符串? 这个问题在 Stack Overflow 上非常热门,成千上万的开发者都曾问过。这并不奇怪:字符串是任何应用程序的基础,而快速在其中搜索子字符串的能力是一项基本技能。
在本教程中,我们将介绍三种实用的方法:从最现代(也是大家最喜欢的)到带有额外功能的经典方法。你将了解何时使用哪种方法,并学会编写在面试中拿得出手的代码。
方法 #1:includes() — 简单而优雅
如果你使用现代 JavaScript(ES6 及以上)编写代码,那么 includes() 是你最好的朋友。此方法返回 true 或 false,读起来就像普通的英语问题:“字符串是否包含子字符串?”
语法
string.includes(searchString, position)searchString— 我们要搜索的内容(必需)。position— 可选参数,从哪个索引开始搜索(默认为 0)。
实际示例
const message = "Привет, мир! JavaScript — это круто.";
console.log(message.includes("JavaScript")); // trueconsole.log(message.includes("Python")); // falseconsole.log(message.includes("мир", 10)); // false(从第 10 个字符开始搜索)请注意:该方法区分大小写。"javascript" 和 "JavaScript" 是不同的字符串。如果你需要忽略大小写,只需将两个字符串都转换为小写:
const text = "Изучаем JavaScript";const keyword = "javascript";
console.log(text.toLowerCase().includes(keyword.toLowerCase())); // true何时使用
- 表单验证(检查电子邮件是否包含“@”)。
- 列表搜索(过滤商品)。
- 任何简单的包含性检查。
方法 #2:indexOf() — 永不过时的经典
在 includes() 出现之前,所有人都使用 indexOf()。它不仅仅是说“是/否”,而是返回子字符串首次出现的索引。如果未找到子字符串,则返回 -1。
语法
string.indexOf(searchValue, fromIndex)示例
const sentence = "Я люблю JavaScript и Python.";
console.log(sentence.indexOf("люблю")); // 2console.log(sentence.indexOf("Ruby")); // -1
// 检查是否包含if (sentence.indexOf("JavaScript") !== -1) { console.log("是的,字符串包含 JavaScript!");}微妙之处:为什么不用 !== -1?
许多初学者会写 if (str.indexOf("word")) — 这是一个错误。如果子字符串位于开头(索引 0),条件 if (0) 会被视为 false。始终要与 -1 进行比较。
何时使用 indexOf() 而不是 includes()
- 当你需要子字符串的起始索引时(例如,为了截取字符串的一部分)。
- 处理旧代码(IE 和旧版浏览器)。
- 当你需要查找所有出现的位置时(在循环中更改
fromIndex)。
方法 #3:search() 和 RegExp — 当需要灵活性时
如果你需要查找的不仅仅是一个单词,而是一个模式呢?例如,“所有以“JS”开头的单词”或“格式为 +7-xxx-xxx-xx-xx 的电话号码”。这时,正则表达式和 search() 方法就派上用场了。
语法
string.search(regexp)
博客
书籍推荐
推荐阅读