(请参阅答案末尾的ES2015更新。)
您已经标记的问题都string和regex。
在JavaScript中,反斜杠在字符串文字和正则表达式中都有特殊含义。如果你想在字符串或正则表达式中使用实际的反斜杠,你必须写两个:\\。
这个字符串以一个反斜杠开头,你在文字中看到的第一个是一个转义字符,告诉我们按字面意思取下一个字符:var str = "\\I have one backslash";
这个正则表达式将匹配单个反斜杠(不是两个); 再一次,你在文字中看到的第一个是一个转义字符,告诉我们按字面意思取下一个字符:var rex = /\\/;
如果您使用字符串来创建正则表达式(而不是像我上面那样使用正则表达式文字),请注意您正在处理两个级别:字符串级别和正则表达式级别。因此,要使用与单个反斜杠匹配的字符串创建正则表达式,最终使用四个:// Matches *one* backslashvar rex = new RegExp("\\\\");
那是因为首先,你正在编写一个字符串文字,但你想在其中放入反斜杠。所以你要\\为你想要的每一个反斜杠做到这一点。但是你的正则表达式也需要两个\\你想要的每个真正的反斜杠,所以它需要在字符串中看到两个反斜杠。因此,共有四个。这是我new RegExp(string)尽可能避免使用的原因之一; 我很容易混淆。:-)
ES2015更新
快进到2015年,正如Dolphin_Wood指出新的ES2015标准为我们提供了模板文字,标签功能和String.raw功能:// Yes, this unlikely-looking syntax is actually valid ES2015let str = String.raw`\apple`;
str结束有字符\,a,p,p,l,和e在它。请注意,${在“字符串”(模板)中没有,因为这是模板文字并${开始替换。例如:let foo = "bar";let str = String.raw`\apple${foo}`;
......结束了\applebar。另请注意,这与C#中的“逐字”字符串不太相似,因为不允许与规范中的LegacyOctalEscapeSequence匹配的序列并导致语法错误。所以举个例子// Failslet str = String.raw`c:\foo\12\bar`;
...失败,因为\12看起来像遗留的八进制文字。