JSON.parse处理正则字符串时异常

coding时遇到一个场景需要后端接口返回正则表达式,且正则表达式是以字符串的形式放到一个JSON数据中去的。我们在联调过程中就会发现前端通过JSON.parse转义后的对象,正则表达式里的反斜杠“\”会有丢失。

chrome控制台测试结果如图:

demo1

我们可以看到,JSON.parse在处理反斜杠的字符串时,会丢失反斜杠或直接报错。报错信息:

1
2
3
VM3086:1 Uncaught SyntaxError: Unexpected token a in JSON at position 7
at JSON.parse (<anonymous>)
at <anonymous>:1:6

在不了解原因的情况下,我又试了直接输出字符串会出现什么效果,如图:

demo2

可以看到javascript字符串在遇到反斜杠时不会报错,但是也会丢失部分反斜杠

所以可以先从反斜杠下手查找对应文档,我们都知道反斜杠“\”是转义字符。那么反斜杠到底可以转义哪些字符呢?这里是MDN的列表:

转义符

那么不在这个列表的字符跟在反斜杠后会发生什么呢?demo2的结果告诉我们JavaScript在字符串里会直接忽略这个反斜杠并返回。

那么为什么到JSON.parse会直接报错了呢?

这个问题的关键点就是JSON.parse方法内的值其实首先是一个字符串,那么JavaScript就会先对这个字符串进行处理,所以真正传给JSON.parse方法的值应该如图:

demo2

JSON.parse是在遇到反斜杠后的字符不在支持的转义列表后才报的错。这里可以看出JSON.parse和JavaScript字符串在处理转义符时是有差异的,JavaScript字符串是忽略,JSON.parse报错。