都2021了,你还在用replace吗

前言:你是否有这样的困扰:想用一个指定的字符串替换原字符串中的所有满足条件的部分,比如用“*”替换“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的使用方法,你学会了吗?
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享