includes()、startsWith()、endsWith()可快速替代简单正则判断,适用于固定子串存在性、前缀/后缀校验,具更高性能、更强可读性与安全性,但不支持位置获取、分组提取或模糊匹配。

这三个方法能快速替代一部分简单正则判断,尤其适合检查固定子串是否存在、是否在开头或结尾——写法更短、可读性更强、执行更快,且不涉及正则引擎开销。
检查子串存在:用 includes() 替代 /xxx/.test()
当只需知道某段文字“有没有出现”,不需要位置或捕获时,includes() 比正则更直接。
- ✅ 推荐场景:表单校验关键词、日志中筛选含特定词的行、URL 参数检查
- ❌ 不适用:需要获取匹配位置、提取分组、处理模糊模式(如“a.b”或“\d+”)
- 示例:
"user@example.com".includes("@")→true,比/@/.test("user@example.com")少写 6 个字符,语义更明确
验证前缀:用 startsWith() 替代 /^prefix/.test()
判断字符串是否以某固定内容开头,startsWith() 是最自然的选择,支持起始偏移,比正则简洁可靠。
- ✅ 推荐场景:协议识别(
https://)、命令前缀(/help)、配置键过滤(api_) - ⚠️ 注意大小写敏感,如需忽略,可先转小写:
str.toLowerCase().startsWith("http") - 示例:
"https://site.com".startsWith("https://")→true;"data.json".startsWith("data.", 0)→true
验证后缀:用 endsWith() 替代 /\.ext$/.test()
判断文件扩展名、API 路径结尾、版本号标记等固定尾部内容,endsWith() 直观安全,还支持截断长度控制。
- ✅ 推荐场景:文件类型判断(
.pdf、.js)、路径规范化(是否以/结尾)、环境标识(-prod) - ⚠️ 第二个参数是“视为前 N 个字符来检查”,不是起始索引,例如
"hello".endsWith("lo", 4)表示只看前 4 个字符"hell"是否以"lo"结尾 →false - 示例:
"report.xlsx".endsWith(".xlsx")→true;"v2.1.0-beta".endsWith("-beta")→true
为什么它们比正则更合适?
这些方法专为布尔型匹配设计,没有回溯、不编译、不捕获,因此:
- 性能更高:V8 等引擎对它们做了深度优化,比等效正则快 2–5 倍
- 更安全:不会因用户输入意外构造恶意正则(如
.*导致 ReDoS) - 更清晰:一眼看出意图,无需理解正则语法和边界符
- 更可控:第二个参数让范围判断变得明确,而正则中要写
^prefix或suffix$还得注意全局标志和多行模式

















