都2021了,你还在用replace吗

1,435 阅读2分钟

前言:你是否有这样的困扰:想用一个指定的字符串替换原字符串中的所有满足条件的部分,比如用“*”替换“aabbccda”中所有的字符‘a’,然后查遍String的所有方法,只找到replace方法,但是replace只能替换第一个符合的字符a,只能通过其他的一些方式进行全部替换。js中怎么没有全部替换的方法呢?那么,今天它来了--replaceAll。

  • String.prototype.replace的局限性 正如前言所说,当我们想要将字符串“aabbccda”中的“a”替换为“*”时,想到的方法是replace,但是看一下replace方法的定义:

replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。 所以,如果直接用replace方法替换,则只会替换第一个满足条件的值:

'aabbccda'.replace('a', '*'); // "*abbccda"

那么如何才能全部替换出现的“a”?以下提供两种常用的方法:
(1)正则表达式

'aabbccda'.replace(/a/g, '*'); // "**bbccd*"

(2)字符串的split方法

'aabbccda'.split('a').join('*'); // "**bbccd*"

虽然上面两种方式可以达到全部替换的目的,那么有没有更直接的方法呢?

  • String.prototype.replaceAll replaceAll方法目前处于stage4阶段,预计会在ES2021发布。它的使用方法很简单,和replace一样:

replaceAll() 方法返回一个新字符串,新字符串所有满足 pattern 的部分都已被replacement 替换。pattern可以是一个字符串或一个 RegExp, replacement可以是一个字符串或一个在每次匹配被调用的函数。原始字符串保持不变。 语法: const newStr = str.replaceAll(regexp|substr, newSubstr|function) 那么,前面提到的问题就可以用replaceAll方法解决:

'aabbccda'.replaceAll('a', '*'); // "**bbccd*"

是不是很简单,但是使用replaceAll方法时需要注意一点:

特别注意📢:如果regexp|substr为一个非全局的正则表达式,则replaceAll抛出错误。

'aabbccda'.replaceAll(/a/, '*'); // Uncaught TypeError: String.prototype.replaceAll called with a non-global RegExp argument

为什么会报错呢?

replaceAll方法是替换所有的,但是正则表达式是非全局的,所以编译器不知道要怎么处理了,所以会报错。

  • 以上就是replaceAll的使用方法,你学会了吗?