JavaScript的replace方法替换行为取决于参数类型和正则标志:字符串模式仅替换首个匹配项;正则模式需加g标志才全局替换;函数替换值会为每次匹配调用一次;特殊符号如$1、$&在字符串中按模板解析。
javascript 的 replace 方法不是简单地“找一个换一个”,它的执行逻辑取决于参数类型、正则标志以及是否使用函数作为替换值,稍不注意就会得到意外结果。
字符串模式:只替换第一个匹配项
当第一个参数是普通字符串时,replace 仅替换**首次出现的子串**,不会全局替换。
例如:
"aabbcc".replace("b", "X") → "aaXbcc"即使目标字符串中存在多个相同子串,也只处理最左边的第一个。若需全部替换,必须借助正则表达式并添加 g 标志。
正则模式:受标志控制替换范围
使用正则表达式时,replace 是否全局替换,取决于正则是否带 g(global)标志:
立即学习“Java免费学习笔记(深入)”;
-
/b/g→ 替换所有 "b" -
/b/(无 g)→ 仅替换第一个 "b" -
/b/i(有 i 无 g)→ 忽略大小写,但仍只替换第一个匹配项
注意:g 和 i 等标志只影响匹配行为,不改变 replace 本身的机制——它始终基于正则的匹配结果逐次调用替换逻辑。
函数作为替换值:每次匹配都触发一次调用
当第二个参数是函数时,该函数会在**每次匹配成功时被调用一次**,接收匹配相关的参数(如匹配内容、捕获组、位置、原字符串等)。
例如:
"abc abc".replace(/b/g, (match) => match.toUpperCase()) → "aBc aBc"这里函数被执行了两次,分别对应两个 "b"。如果漏掉 g 标志,函数只会执行一次。
常见陷阱:在函数中修改外部变量或依赖闭包状态时,要注意调用次数和顺序,尤其在异步上下文中容易误判执行时机。
捕获组与特殊替换符号:$1、$& 等不是变量而是模板语法
replace 支持在字符串替换值中使用特殊符号,如 $1(第一个捕获组)、$&(整个匹配)、$$(字面量 $)等。这些符号在替换前被解析,不是 JavaScript 变量,也不参与作用域查找。
例如:
"hello world".replace(/(\w+) (\w+)/, "$2, $1") → "world, hello"注意:$1、$2 对应正则中的括号捕获顺序,若捕获组未匹配(比如用了 ? 且未命中),对应位置会变成空字符串,而非 undefined。


















