匹配字面量下划线\_需写\\\_,因JS字符串中\是转义符,正则引擎需接收\\_;等价写法为/\\\_/或new RegExp("\\\_");用[a-zA-Z0-9\_]比\w更安全精准。
JavaScript 正则表达式本身不“使用\_”,而是用 \\(两个反斜杠)来匹配字面量的下划线 _。这是初学者最常卡住的地方:写 _ 不起作用,写 \_ 报错,真正该写的是 \\_。
_ 要写 \\_?因为 JavaScript 字符串里,\ 是转义字符。正则表达式引擎看到的原始模式,必须是字面量 \_;而要让字符串中出现这个 \_,就得在 JS 里写成 "\\_"(第一个 \ 转义第二个 \,最终传给 RegExp 的是单个 \_)。
等价写法:new RegExp("\\_") 或字面量 /\\_/ —— 后者更常用,且无需双重转义。
/_/ → 实际匹配任意字符(_ 在正则里不是特殊字符,但这里没问题);真正危险的是想匹配字面量却漏掉反斜杠/\_/ → 语法报错,因为 \_ 不是合法转义序列/\\_/ 或 new RegExp("\\_")
\\w 和 [a-zA-Z0-9_] 都能匹配下划线,但有区别
\w 确实包含下划线,但它还匹配 ASCII 字母、数字,且在某些正则标志(如 u)下可能扩展为 Unicode 字母 —— 这未必是你想要的。
如果你只想要下划线(比如校验用户名只允许字母、数字、下划线),别偷懒用 \\w,显式写出字符集更安全:
/^[a-zA-Z0-9_]+$/
/\\w+/ 可能意外匹配到带重音符号的字母(启用 u 标志时)/[a-zA-Z0-9_]+/ 行为确定,无歧义^ 和 $,否则 "abc_def" 里 "_def" 也会被部分匹配_ 时,别忘了 g 标志用 replace() 全局替换下划线,必须加 g,否则只换第一个:
"a_b_c".replace(/\\_/g, "-") // → "a-b-c"
g:结果是 "a-b_c"(只替换了第一个)"a_b_c".replace("_", "-"),也只换第一个 —— 这是 String.prototype.replace 的默认行为g,要么用 split("_").join("-")(更直观,无正则开销)真正容易被忽略的,是正则字面量和字符串构造器对反斜杠的处理差异:写 /\\_/ 是对的,但写 new RegEx 就错了 —— 因为字符串解析阶段就崩了。只要涉及动态生成正则(比如拼接变量),优先用 
new RegExp(escapeForRegex(str)) 或直接避免正则,改用 includes()、indexOf()、split() 等原生方法。