首页/开发/正则与编码速查/JS 字符串转义与 JSON 差异

JS 字符串转义与 JSON 差异

JS 字符串字面量允许单引号、\xHH、\u{码点}、行末续行与模板字符串,未知转义还会静默退化;JSON 只认固定几个转义且必须双引号。把 JS 字面量交给 JSON 解析器必然报错,稳妥做法是用序列化器互转。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​​​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​​‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

两边的规则差异

JavaScript 字符串字面量和 JSON 字符串长得像,规则却明显不同:JS 额外支持单引号、\xHH、\u{码点}、\0、行末续行与模板字符串,还允许「不认识的反斜杠转义直接退化为字符本身」。JSON 只认几个固定转义,任何越界写法都是语法错误。把 JS 字面量直接塞进 JSON 解析器,是配置类问题最常见的故障来源。

两边规则对照

引号JS 单/双引号均可;JSON 只能双引号
十六进制转义JS 支持 \xHH;JSON 不支持,只有 \uXXXX
码点转义JS 支持 \u{1F600};JSON 不支持
未知转义JS 静默退化为该字符(\d 等于 d);JSON 报语法错误
其它JS 有行末续行、模板字符串 ${}、正则字面量;JSON 一概没有

典型使用场景

  • 把前端写好的常量对象搬进 .json 配置文件,去掉单引号与注释
  • 调试接口返回:判断字符串是 JSON 还是被塞进 JS 源码
  • 在 JS 里安全地拼出一段 HTML 属性或 SQL 片段中的字符串常量
  • 把正则写进 JSON 配置,注意反斜杠需要成对而不是 \x
  • 排查「本地能跑、构建后报错」,往往是把 JS 字面量交给了严格解析器

字面量差异实测

字面量差异实测
// JS 合法,JSON 非法
const a = 'it\'s';          // 单引号 + 转义引号
const b = '\x41';           // 'A'
const c = '\u{1F600}';      // 码点形式
const d = '\d';             // 结果是 'd':未知转义退化为字符本身
const e = "a\
b";           // 行末续行,结果是 'ab'
// 用 JSON.stringify 生成可粘贴进 JSON 的字符串
JSON.stringify("C:\\tmp")   // '"C:\\\\tmp"'

互换时的处理方式

来源写法目标 JSON处理建议
'abc'非法改双引号,或让工具序列化
\x41非法先按 JS 解析再序列化为 JSON
\u{1F600}非法转成代理对 \uD83D\uDE00
\d非法本意是正则,JSON 里写 \\d
// 注释非法删掉注释,配置说明移到文档
JS 的「未知转义退化」特性很隐蔽:字符串里写 \d 不会报错,只是拿到 d。如果这段内容随后被当作正则,行为就与预期完全相反;写正则请用正则字面量或 RegExp 构造函数配双反斜杠。
2019 年起 JSON.stringify 对孤立代理做了良构化处理,会把它输出成 \uD800 这样的转义;但这只是避免输出非法文本,语义上仍是残缺字符,源头问题还得在数据侧解决。

易错点

  • 把 JS 对象字面量直接改名成 .json 使用,注释、单引号、尾逗号会让解析器在第一个问题处就停下
  • 在 JSON 里写 \d、\x41 期待等价语义,得到的是语法错误,正则内容必须写成 \\d
  • 认为 JSON.stringify 的输出能安全嵌进模板字符串:反引号和 ${ 不会被它转义,仍可能截断字符串
  • 把 RegExp 对象或 undefined、Date 直接序列化进 JSON,前者变成空对象、后者被丢弃,前后端字段对不上
  • 在浏览器里用 eval 解析配置以求宽松,等于给自己开了一个代码执行入口

数据来源与参考

  • ECMA-262:String Literals 与 NonEscapeCharacter 规则
  • RFC 8259:JSON 字符串语法
  • MDN:String、模板字面量与 JSON.stringify

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/js-string-escape-diff.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​​​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​​‌‌​​‌‌​​‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​