JavaScript的String.replace()函数遇到$符合的时候不好使?

2022-03-25大约3分钟

在JavaScript里编程的时候,字符串替换最常用的方式就是用String.replace()了。

比如:

let str = "{0}'s car";
console.log(str.replace('{0}', 'Tom')); // 输出:Tom's car

但是,如果上面的代码替换成这样,结果会是怎样呢?

let str = "{0}'s car";
console.log(str.replace('{0}', '$&Tom'));  // {0}Tom's car

是不是很出乎意料?原始字符串里面的{0}竟然没有被替换掉,$&也消失了。

是不是JavaScript的bug? 其实不是的,原因是$符号在字符串替换的时候是一个特殊字符,所以在替换字符串的时候,如果有$符号,需要转义一下。

$符号的转义,要用$符号。即一个$要变成$$,是不是很绕?看例子:

let str = "{0}'s car";
console.log(str.replace('{0}', '$$&Tom'));  // $&Tom's car

在上面的例子里,我们把替换的字符串里面换成了$$,这时候替换的结果里面出现了$&,证明好使了。

那么,我们再实现一个可以复用的replace函数:

function replace(searchValue, replaceValue) {
    if (replaceValue.includes('$')) {
        // 把replaceValue里的每个'$'变成'$$'
        replaceValue = replaceValue.replaceAll('$', '$$$$'); 
    }
    return searchValue.replace('{0}', replaceValue);
};

console.log(replace("{0}'s car", '$&Tom')); // $&Tom's car

这样就可以了。