【问题标题】:JavaScript String replace vs replaceAllJavaScript字符串替换与replaceAll
【发布时间】:2021-04-28 08:34:16
【问题描述】:

ECMAScript 2021 添加了一个新的字符串函数replaceAll。 很久以前,在不远的星系中,人们使用split + join 或正则表达式来replace all occurences of a string

我创建了以下示例以将新方法与旧方法进行比较。 虽然我可以在第一种情况下看到一些差异,例如我不能将 replacement patternssplit + 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"

【问题讨论】:

  • 如果我没记错的话,这个方法主要是为了捕捉 not 之前添加 g 标志的错误(即这是一个实际的运行时错误,与可能的逻辑错误相比)或者在代码运行时可能不会出现)。浏览器支持:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。它也比带有g 标记的正则表达式的replace 更明确。
  • 请只问 1 个问题。

标签: javascript string replaceall ecmascript-2021


【解决方案1】:

通过收集documentationreplaceAll,我们发现了以下花絮:

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

注意:使用regexp 时,您必须设置全局(“g”)标志;否则会抛出 TypeError: "replaceAll must be called with a global RegExp"。

换句话说,当使用正则表达式或RegExp 调用replaceAll 时,它必须使用全局标志。因此,与仅使用当前的 replace 相比,调用 replaceAll 似乎并没有多少收获。但是,与replaceAll 的一个区别是,当传递一个字符串时,它会自动进行全局替换。无需输入全局标志,您可以在此处节省一些打字时间。

【讨论】:

  • 我是在对 PHP 有了一定的了解后才开始学习 Javascript 的。很长一段时间以来,我不断发现myString.replace('apples', 'oranges') not 等同于str_replace('apples', 'oranges', $My_String)(因为 PHP 函数是 global 字符串替换,例如 @ 987654331@ 但与replace 不同)。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2012-06-10
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多