使用美元符号 ($) 作为替换时,`string.replace` 函数的行为很奇怪

15
我在我的JavaScript代码中发现了一个bug,我已经限定到了一个字符串替换的位置,但它的表现方式并非我所预期。以下是代码示例:

var text = "as";
text = text.replace(text,"$\'");
console.log(text);

这会在控制台打印一个空字符串。我本来以为它会打印 $' 到控制台上。请问有人能解释一下吗?


3个回答

23

如果我使用$$,其他浏览器会理解我想要'$'而不是将其作为'$$'字符串文字吗?编辑:看起来这是标准的JavaScript。当我第一次问有关其他浏览器的问题时,对我来说,这似乎是Firefox的怪癖。 - user1052335
这是标准行为,在IE中也可以正常工作:http://msdn.microsoft.com/zh-cn/library/windows/apps/t0kbytzc(v=vs.94).aspx - Misha Reyzlin
1
谢谢。我不确定这是标准的JavaScript还是Firefox的怪癖。 - user1052335
值得一提的是:痛苦的是,奇数个$的字符串可以将其替换的$“四舍五入”,就像这样。所以(使用Chrome),"1,2,3,4".replace(/,/g, "$$$")会得到"1$$2$$3$$4"。也就是说,在这里,一个转义的$加上一个未转义的(即$$$)就像两个转义的($$$$)一样!这使得双倍转义模式更难以嗅探。;^) - ruffin

21

如果我不知道我的替换字符串中有什么,我会使用

replaceWith = "might have 2 $ signs $$ $$$ $$$$"
"a b c".replace("b", replaceWith) // unexpected result
"a b c".replace("b", function(){return replaceWith}) // no surprises

1
这真是太简单又太有用了!谢谢,省了我很多麻烦。我开始考虑如何用正则表达式转义所有 $ 的问题... 显然不是个好主意! - Kaddath
2
这个技巧在我的一个项目中真正拯救了我,因为模板化的本地化字符串被广泛使用。如果需要从用户输入或其他地方转义$,那么解决起来会有点麻烦。只需在字符串前面加上() =>就可以轻松解决问题。 - Zack Campbell
最佳回复,不需要烦恼转义。您想要插入作为替换的确切字符串就是它将得到的。 - Omer

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接