JavaScript字符串的replace和replaceAll的区别

36
ECMAScript 2021添加了一个新的字符串函数replaceAll。很久以前,在一个不太遥远的星系里,人们使用split+join或正则表达式来替换字符串的所有出现
我创建了下面的例子来比较新方法和旧方法。虽然在第一种情况下我能看到一些差异,例如我不能使用替换模式split+join,或者我需要用RegExp(str,"g")转义特殊字符,但我在第二种情况下看不到任何差异。
新方法和旧方法之间有哪些差异(行为差异、性能、浏览器兼容性等)?

const source = "abcdefabcdef";
const str1 = "abc", str2 = "xyz";
const reg1 = /abc/g, reg2 = "xyz";

//Case 1 : When we want to replace a string by another
console.log(source.split(str1).join(str2));
console.log(source.replace(new RegExp(str1,"g"),str2));
//versus
console.log(source.replaceAll(str1,str2));

//Case 2 : When we want to use a regular expression
console.log(source.replace(reg1,reg2));
//versus
console.log(source.replaceAll(reg1,reg2));

//Result = "xyzdefxyzdef"


3
如果我没记错的话,这个方法主要是为了捕捉之前没有添加 g 标志的错误而添加的(也就是一个真正的运行时错误,而不是当代码运行时可能存在或不存在的逻辑错误)。浏览器支持情况请参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll#browser_compatibility 。与带有 g 标志的正则表达式的 replace 方法相比,它更加明确。 - Felix Kling
请只提出一个问题。 - trincot
1个回答

33

从阅读replaceAll文档中,我们可以得到以下信息:

const newStr = str.replaceAll(regexp|substr, newSubstr|function)

注意:使用正则表达式时,必须设置全局(“g”)标志;否则,它将抛出一个TypeError:“replaceAll必须使用全局RegExp调用”。

换句话说,当使用正则表达式字面量或RegExp调用replaceAll时,必须使用全局标志。因此,与当前的replace相比,使用replaceAll似乎没有太大的优势。然而,replaceAllreplace的一个区别是,在传递字符串时,它会自动执行全局替换。这就是你可能会节省一些输入时间的地方,因为不需要输入全局标志。


2
我在掌握了 PHP 后才开始学习 JavaScript。很长一段时间里,我一直被 myString.replace('apples', 'oranges') 不等同于 str_replace('apples', 'oranges', $My_String) 这个事实所困扰(因为 PHP 函数是全局字符串替换,类似于 replaceAll 但不同于 replace)。 - Rounin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接