Javascript字符串取代怪异 - $$$$被折叠为$$ - 这个结果背后的原因是什么?

Gop*_*han 2 javascript string replace

在工作中,我遇到了一个问题,我们的应用程序的用户正在接收具有无效unicode字符(0xffff)的消息,根据标准,该字符永远不应该映射到符号.

作为一个快速的工作,我做了以下:

badStr.replace(/\uffff/g, " ");
Run Code Online (Sandbox Code Playgroud)

它按预期工作,并让用户继续使用该应用程序,直到找到更好的解决方案.

然而,当我正在玩这个时,我随机尝试了一个字符串替换"$$$$",它以某种方式折叠了"$$".

你可以亲眼看看.尝试在浏览器网址栏中粘贴以下行:

javascript: alert(String.fromCharCode(0xffff).replace(/\uffff/g, "@@@@"));
Run Code Online (Sandbox Code Playgroud)

结果是 @@@@

javascript: alert(String.fromCharCode(0xffff).replace(/\uffff/g, "$$$$"));
Run Code Online (Sandbox Code Playgroud)

结果是$$

这实际上似乎是任何字符串替换的问题,使用$$$$作为字符串替换.

都:

javascript: alert(String.fromCharCode(0x1234).replace(/\u1234/g, "$$$$"));
javascript: alert("hella".replace("h", "$$$$")); 
Run Code Online (Sandbox Code Playgroud)

导致$$崩溃.

关于为什么字符串替换行为这样的任何想法?

Wla*_*ant 7

那是因为$在替换字符串中有特殊含义(组扩展).看看这个例子:

alert("foo".replace(/(.*)/, "a$1b"));
Run Code Online (Sandbox Code Playgroud)

这就是为什么$$被解释为$,对于你需要实际替换某些东西的情况$1(字面意思是没有组扩展):

alert("foo".replace(/(.*)/, "a$$1b"));
Run Code Online (Sandbox Code Playgroud)

另请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter.

  • 另请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace (2认同)