优先使用 includes()、startswith()、endswith() 处理固定子串的存在性、开头/结尾匹配,它们更轻量、安全且易读;仅当需定位、捕获、模糊匹配或复杂模式时才用正则。

直接用 includes()、startsWith() 或 endsWith() 就行,别一上来就写正则——简单场景下它们更轻、更快、更安全,也更容易看懂。
检查子串是否存在:优先用 includes()
只要确认某段文字里“有没有”某个固定词,不需要位置、不关心出现几次,includes() 是最直白的选择。
- 比
/xxx/.test(str)少写括号、斜杠和 test 调用,语义一目了然 - 支持第二个参数
fromIndex,从指定位置往后搜(比如跳过开头的协议部分) - 大小写敏感,如需忽略,可配合
toLowerCase()使用,但注意别直接在用户输入上无条件转小写(可能影响业务逻辑)
判断是否以某内容开头:用 startsWith()
验证协议(https://)、命令前缀(/login)、配置键名(api_)这类固定头部,startsWith() 天然匹配意图。
- 第二个参数是起始搜索索引,例如
str.startsWith("id", 3)表示从第 4 个字符开始判断是否以 "id" 开头 - 不会误判中间出现的情况,比正则
^id更专注,也不用担心多行模式干扰 - 如果要兼容大小写,建议统一转换再比,而不是靠正则的
i标志
判断是否以某内容结尾:用 endsWith()
校验文件扩展名(.json)、API 路径收尾(/list)、环境后缀(-dev),endsWith() 比写 /\.json$/.test() 清晰得多。
- 第二个参数不是“从哪开始查”,而是“只看前面多少个字符”,例如
"abcde".endsWith("de", 4)实际检查的是"abcd"是否以"de"结尾 → 返回false - 对空字符串
""返回true(任何字符串都“以空结尾”),这点和正则行为一致,但要注意业务是否允许 - 不支持通配或模糊,比如
.js*或.min.js这类变体,就得换别的方法
什么时候还得用正则?
这三个方法全是布尔返回、只认固定字符串、不捕获、不回溯。一旦需求超出这个范围,正则就不可替代:
- 需要知道匹配在什么位置(
indexOf或exec()的index) - 要提取分组,比如从
"user-123-name"中取出数字和 name - 匹配模式不固定:邮箱、手机号、日期格式、带通配的路径(
/user/*/profile) - 需要全局替换、分割、或做多次匹配(
matchAll)











