replace默认只替换第一个匹配项,需正则加g标志才全替;replaceAll默认全部替换,字符串或正则均可,但正则必须带g标志,且ES2021新增、旧浏览器不支持。

JavaScript中replace和replaceAll都能替换字符串,但行为差异明显:前者只替换**第一个匹配项**(除非配合正则全局标志),后者默认替换**所有匹配子串**,且对普通字符串更安全。
replace 默认只换第一个,需正则 + g 才能全替
replace 的设计初衷是单次替换。传入字符串时,永远只处理首个匹配:
"aabbcc".replace("b", "x") → "aaxbcc"(仅第一个 "b" 被换)
想全部替换?必须用正则表达式并带上 g(global)标志:
立即学习“Java免费学习笔记(深入)”;
-
"aabbcc".replace(/b/g, "x")→"aaxxcc" - 若同时需要忽略大小写,加
i:"AaBbCc".replace(/b/gi, "x")→"AaxxCc"
注意:直接传字符串无法开启全局替换,"aabbcc".replace("b", "x") 加再多参数也没用。
replaceAll 直接全替,字符串/正则都支持
replaceAll 是 ES2021 新增方法,语义明确——不管输入是字符串还是正则,目标就是全部替换:
-
"aabbcc".replaceAll("b", "x")→"aaxxcc" -
"aabbcc".replaceAll(/b/g, "x")→ 同样是"aaxxcc"(但g标志可省略,即使写了也不报错)
⚠️ 重要限制:如果传入正则表达式,它**必须带 g 标志**,否则会抛错:"aabbcc".replaceAll(/b/, "x") → TypeError。
特殊字符与正则元字符要小心
用字符串做搜索词时,replace 和 replaceAll 都不做正则解析,所以点号.、星号*等就是字面意思:
-
"a.b.c".replace(".", "x")→"axb.c"(只换第一个点) -
"a.b.c".replaceAll(".", "x")→"axbxc"(全部点都被换)
但一旦换成正则,元字符就生效了。想匹配真实点号,得转义:/\./g。
浏览器兼容性与实际选用建议
replaceAll 在 IE 完全不支持,Chrome 85+、Firefox 78+、Safari 13.1+ 开始支持。如需兼容老环境,可用 replace + 正则 /.../g 替代。
- 现代项目、确定运行环境较新 → 优先用
replaceAll,语义清晰不易出错 - 需兼容 IE 或旧版移动端 → 坚持用
replace(/pattern/g, ...) - 动态拼接搜索字符串且含正则元字符 → 先
escape再构造正则,或改用replaceAll(避免意外触发正则逻辑)










