模板字符串中反斜杠默认被转义,易致路径或正则错误;应使用String.raw获取原始字符串,它保留所有反斜杠字面意义,支持插值但不处理转义,适用于Windows路径、正则表达式等场景。

模板字符串中反斜杠()默认会被解释为转义字符,比如
变成换行、 变成制表符。在表示文件路径(尤其是 Windows 路径如 C:Users
amedocs)或正则表达式时,这容易导致意外错误或语法报错。解决方法不是手动加倍反斜杠,而是用 String.raw 获取原始字符串——它让所有反斜杠都“字面化”保留,不触发任何转义。
为什么普通模板字符串会出问题
在标准模板字符串中,即使写成:
`C:Users
ameile.txt`
JavaScript 仍会尝试解析 U、
、 等组合。其中 U 不是合法转义序列,直接报错 Invalid Unicode escape sequence;
则被替换成真实换行符,破坏路径结构。
String.raw 是怎么工作的
String.raw 是一个标签函数,作用于模板字符串的**原始字符序列**(即引擎尚未处理转义前的输入)。它忽略所有反斜杠的特殊含义,原样返回。
- ✅ 正确写法:
String.raw`C:Users ameile.txt`→ 字符串值就是"C:\Users\name\file.txt"(显示为两个反斜杠,实际每个\表示一个字面反斜杠) - ✅ 也支持插值:
String.raw`path: ${dir}ile.txt`,仅对静态部分保持原始性,插值内容照常计算 - ❌ 错误写法:
String.raw('C:Users...')—— 它只接受模板字符串,不接受普通字符串字面量
常见适用场景
以下情况强烈建议优先使用 String.raw:
-
Windows 文件路径:避免
U、等非法转义;例如String.raw`C:Projectsmy-appsrcindex.js` -
正则表达式字面量:写
/d+.d+/时,模板中要避免.被误读,用String.raw`d+.d+`更安全 - 多行文本含反斜杠:如 SQL 片段、配置片段、CLI 命令等需要严格保留反斜杠的场景
注意边界:String.raw 不等于完全无处理
String.raw 仅禁用转义,但**不禁止模板插值和换行**:
- 插值仍生效:
const x = 'test'; String.raw`a${x}b`→"atb" - 换行符仍保留:
String.raw`line1 line2`中的是两个字符和n,但换行符本身(回车+换行)仍是真实换行,不会被转义干扰 - 仍需避免非法 Unicode 标签:如
String.raw`u{GGG}`依然报错,因为u{}解析发生在 raw 处理之前










