test返回布尔值用于判断匹配存在,exec返回匹配对象用于提取内容;test适合校验场景,开销小且不改变lastindex;exec支持捕获组和全局遍历,但需注意lastindex变化。

test 和 exec 都是正则表达式实例的方法,但目的和返回值完全不同:test 只回答“有没有匹配”,返回布尔值;exec 则回答“匹配到了什么”,返回详细结果对象或 null。
功能定位不同
test 是纯判断型方法,适合做校验、开关控制等逻辑分支场景。比如表单验证邮箱格式是否合法,只需知道 true 或 false 就够了。
- 执行快,不解析捕获组,开销小
- 对非字符串输入会尝试转换(如数字 123 → "123"),失败则抛 TypeError
- 不改变正则实例的 lastIndex 属性(即使带 g 修饰符)
返回内容差异明显
exec 返回的是一个数组,包含匹配文本、捕获组、index(起始位置)、input(原字符串)等信息,结构丰富,适合提取数据。
- 匹配成功时,哪怕没写捕获组,也会返回类似
["abc", index: 0, input: "abc"]的对象 - 有捕获组时,数组第 1 项起依次为各组匹配内容,例如
/a(b)c/.exec("abc")返回["abc", "b", index: 0, input: "abc"] - 带 g 修饰符时,每次调用只返回下一个匹配,配合 while 循环可遍历全部结果
- 会动态更新正则实例的 lastIndex,影响后续 exec 调用位置
全局匹配行为对比
当正则含 g 修饰符时,两者的差异更关键:
- test 始终只检测是否存在至少一次匹配,g 对它无实际影响
- exec 在 g 模式下支持多次调用,每次推进 lastIndex,适合逐个提取匹配项
- 若需一次性获取所有匹配(含捕获组),应改用
String.prototype.match()(不带 g)或matchAll()(推荐)
什么时候选哪个?
简单二分法就能决策:
- 只要判断“是否符合规则” → 用 test(如密码强度校验、URL 协议检查)
- 需要“取出匹配内容”或“定位位置” → 用 exec(如解析日志行、提取 URL 参数、高亮关键词)
- 要拿全部匹配且含捕获组 → 不要用 exec 循环,改用
matchAll()更简洁安全











