String.raw()用于获取原始字符串以避免反斜杠转义,特别适合构建正则表达式;普通字符串中反斜杠会被JS引擎预解析,导致正则模式失效,而String.raw()保留所有字符原样,确保转义正确。

String.raw() 是 JavaScript 中专门用于获取原始字符串(即不处理反斜杠转义)的静态方法,特别适合构建正则表达式字面量模板——避免因字符串预解析导致的转义丢失或错误。
为什么正则模板需要 String.raw()
普通字符串字面量中, 、 、\ 等会被 JS 引擎提前解释。而正则表达式本身也依赖反斜杠(如 d、s、\.),若用普通字符串拼接,容易出现“双转义混乱”:
- "\d+\.\d+" → 实际传给 RegExp 构造函数的是 d+.d+(正确,但难读易错)
- "d+.d+" → 反斜杠被忽略,变成 d+.d+(完全失效)
String.raw() 的基本用法
它接收一个模板字符串(带标签的模板字面量),返回其中所有字符原样保留的字符串,包括反斜杠和换行符:
- String.raw`a b c` → "a\nb\tc"(不是换行和制表)
- String.raw`\d+\.\d+` → "\d+\.\d+"(每个 \ 都保留为两个反斜杠)
构建可复用的正则模板
结合模板字符串变量,用 String.raw 拼接动态正则模式,安全又清晰:
- 定义基础片段:const digits = String.raw`d+`;
- 组合带分隔符的模式:const version = String.raw`${digits}.${digits}.${digits}`; → "d+.d+.d+"
- 生成正则对象:new RegExp(version) 或
注意边界:不能替代 RegExp 构造函数的 flag 处理
String.raw() 只影响字符串内容,不处理正则标志(如 g、i)。标志仍需单独传入 RegExp 构造函数:
- ✅ 正确:new RegExp(String.raw`${word}`, "i")
- ❌ 错误:String.raw`${word}/i`(/i 会被当作字面量,不是标志)











