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

IT技术 javascript
2021-02-09 13:13:16

我在我的 JavaScript 代码中发现了一个错误,我将其隔离到字符串替换中,该错误的行为方式出乎我的意料。这是代码的示例:

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

这将向控制台打印一个空字符串。我期待它打印 $' 到控制台。谁能解释一下?

3个回答

为了$在结果字符串中使用$$$在 JavaScript 正则表达式和字符串replace方法中使用as具有特殊含义https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter

如果我使用 $$,其他浏览器会理解我想要 '$' 而不是接受它作为 '$$' 字符串文字吗?编辑:看起来这是标准的 JavaScript。当我第一次询问有关其他浏览器的问题时,我觉得这是 Firefox 的一个怪癖。
2021-03-17 13:13:16
这是标准化的行为,它也适用于 IE:msdn.microsoft.com/en-us/library/windows/apps/...
2021-03-18 13:13:16
Fwiw:痛苦的是,$可以$这么说,奇数字符串的替换可以“四舍五入”。所以(使用 Chrome),"1,2,3,4".replace(/,/g, "$$$")"1$$2$$3$$4". 也就是说,在这里,一个转义$加一个未转义(即,$$$)的行为就像两个转义($$$$)!使二合一逃逸模式更难嗅探。;^)
2021-03-21 13:13:16
谢谢。我不清楚这是标准 JavaScript 还是 Firefox 的怪癖。
2021-03-29 13:13:16

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

replaceWith = "might have 2 $ signs $$ $$$ $$$$"
"a b c".replace("b", replaceWith) // unexpected result
"a b c".replace("b", function(){return replaceWith}) // no surprises
最好的回复,没有必要逃避逃避。您想要作为替换插入的确切字符串就是它得到的
2021-03-26 13:13:16
由于在整个项目中使用的可本地化字符串中的模板,这个技巧实际上只是在我的一个项目中潜在地拯救了我的屁股。$如果从用户输入或其他任何内容中给出任何 s ,那么整理出哪些s 意味着要转义就有点麻烦了只需() =>在字符串之前抛出并完成它就容易多了。
2021-03-27 13:13:16
这太简单了,太有用了!谢谢,省了我一些麻烦,我开始考虑如何$使用$.. 使用正则表达式来逃避所有问题显然不是一个好主意!
2021-04-08 13:13:16

实际上,对这个问题最直接的回答是使用替换字符串的函数,因为 w3c 规范规定这个结果不会受到特殊字符的影响。

var str = "abc {def} ghi";

console.log(str.replace("{def}", function() {
  return "foo$'bar"; 
}));

// result is
// "abc foo$'bar ghi"

MDN 文档在这里:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace