String.prototype.replaceAll S4
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2021
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案添加了一个 String.prototype.replaceAll 方法,用于替换字符串中给定子字符串(或全局正则表达式)的所有出现,解决了 String.prototype.replace 在给定字符串时仅替换第一次出现的限制。当给定非全局正则表达式时,它会抛出异常以避免混乱。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
String.prototype.replaceAll 提案
状态
Champion: Mathias Bynens (Google, @mathiasbynens)。
该提案处于 TC39 流程 的第 4 阶段,并计划包含在 ES2021 中。
动机
(另请参阅我们的 TL;DR 解释器。)
目前,如果不使用全局正则表达式,就无法替换字符串中所有子字符串的实例。
当 String.prototype.replace 使用字符串参数时,只影响第一个匹配项。大量证据表明开发者在 JS 中试图做到这一点——参见 StackOverflow 问题 有数千个投票。
目前最常见的实现方式是使用全局正则表达式。
这种方法的缺点是需要转义特殊的 RegExp 字符——注意转义后的 '+'。
另一种解决方案是将 String#split 与 Array#join 结合:
这种方法避免了任何转义,但需要将字符串拆分成部分数组再重新拼接,增加了开销。
提议的解决方案
我们提议在 String 原型上添加一个新方法 - replaceAll。这将为开发者提供一种直接的方式来完成这个常见的基本操作。
这也消除了转义特殊正则表达式字符的需求(注意未转义的 '+')。
高级 API
提议的签名与现有的 String.prototype.replace 方法相同:
根据当前的 TC39 共识,String.prototype.replaceAll 在所有情况下都与 String.prototype.replace 表现一致,除了以下两种情况:
- 如果
searchValue是字符串,String.prototype.replace仅替换searchValue的单个匹配项,而String.prototype.replaceAll替换searchValue的 所有 匹配项(如同使用了.split(searchValue).join(replaceValue)或全局且正确转义的正则表达式)。 - 如果
searchValue是非全局正则表达式,String.prototype.replace替换单个匹配项,而String.prototype.replaceAll抛出异常。这是为了避免缺少全局标志(意味着“不要替换所有”)与调用方法的名称(强烈暗示“替换所有”)之间固有的混淆。
值得注意的是,如果 searchValue 是全局正则表达式,String.prototype.replaceAll 的行为与 String.prototype.replace 完全相同。
与其他语言的比较
- Java 有
replace,接受CharSequence并替换所有匹配项。Java 还有replaceAll,它接受一个正则表达式作为搜索项(要求用户转义特殊正则表达式字符),同样默认替换所有匹配项。 - Python 的
replace替换所有匹配项,但接受一个可选参数来限制替换次数。 - PHP 有
str_replace,具有如 Python 的可选限制参数。 - Ruby 有
gsub,接受正则表达式或字符串,但也接受回调块和匹配到替换对的哈希。
常见问题
主要优点是什么?
对于这个常见用例,简化了 API,不需要 RegExp 知识。无需转义 RegExp 语法字符即可进行全局字符串替换。可能在 VM 方面提高优化潜力。
给 replace 添加 limit 参数怎么样?
答:这是一个尴尬的接口——因为默认限制是 1,用户必须知道已有多少次匹配,或者使用像 Infinity 这样的值。
如果 searchValue 是空字符串会发生什么?
String.prototype.replaceAll 遵循 String.prototype.replace 的先例,返回输入字符串,并将替换值插入到每个 UCS-2/UTF-16 代码单元之间。
TC39 会议记录
规范
实现
- SpiderMonkey,随 Firefox 77 发布
- JavaScriptCore,随 Safari 13.1 发布
- V8,随 Chrome 85 发布
- Polyfills: