JavaScript 字符串替换 vs replaceAll

Bap*_*tou 8 javascript string replaceall ecmascript-2021

ECMAScript 2021 添加了一个新的 String 函数replaceAll。很久以前,在一个不远的星系中,人们使用split+join或正则表达式来替换所有出现的字符串

我创建了以下示例来比较新方法和旧方法。虽然我可以在第一种情况下看到一些差异,例如我不能使用带有+ 的替换模式,或者我需要使用 来转义特殊字符,但在第二种情况下我看不出任何区别。splitjoinRegExp(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"
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 7

从拾荒的文档进行replaceAll,我们发现如下花絮:

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

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

换句话说,当replaceAll使用正则表达式文字 or调用时RegExp,它必须使用全局标志。因此,replaceAll与仅使用当前的replace. 但是,与replaceAll它的一个区别是,当传递给它一个字符串时,它会自动进行全局替换。通过不必输入全局标志,您可以在此处节省一些打字时间。

  • 我是在对 PHP 有一定了解后才开始学习 Javascript 的。在很长一段时间里,我不断地发现 `myString.replace('apples', 'oranges')` 并不等于 `str_replace('apples', 'oranges', $My_String)` (因为 PHP函数是一个全局字符串替换,类似于“replaceAll”,但与“replace”不同)。 (2认同)