JavaScript中replace替换含$字符串时单双引号结果差异问题
为什么JavaScript中replace用单引号和双引号包裹参数会有不同结果?
问题出在replace方法的字符串替换参数里,$开头的序列有特殊解析规则,不是单引号本身的问题,是你参数里的$刚好撞上了单引号触发了特殊序列。
看你的代码细节:
- 当用单引号包裹参数时,替换字符串实际是
'123$'。这里的$'是replace的特殊序列,它会被替换成匹配到的子串(也就是input)后面的所有内容——你的原字符串里input后面是),所以$'直接变成了),替换后就成了'123),和原字符串的)拼在一起就是test('123))。 - 用双引号包裹时,替换字符串是
"123$",这里的$后面是",不属于replace的特殊序列字符(特殊序列包括$&、$、$'、$n这类),所以$被当作普通字符保留,最终结果就是正常的test("123$")。
如果想要单引号包裹时也保留$,有两种简单解决办法:
- 把参数里的
$转义成$$(replace里$$代表普通的$字符):
const params = '123$'.replace(/\$/g, '$$'); const res1 = aa.replace(/input/g, `'${params}'`); // 此时res1输出 test('123$')
- 用函数作为replace的第二个参数,函数返回的字符串不会解析$序列:
const res1 = aa.replace(/input/g, () => `'${params}'`); // 这样res1也会输出 test('123$')
内容的提问来源于stack exchange,提问作者风说起就起
相关产品推荐
相关产品推荐

