转义序列是开头的转义字符和其后面的字符组成的序列。转义字符会改变它后面字符的含义,使不可打印的控制字符打印出来(也可以使控制字符失去原来的含义)。然而,我们不一定总是希望字符被转义。
例如,在Javascript中,JSON.parse()会将转义字符转义成控制字符,然后由于JSON中不允许存在这些字符而报错:[danger]Uncaught SyntaxError: Unexpected token in JSON at position 114514[/danger]在C#中也常有正则表达式或者路径里有一堆“\”被认为是转义字符的情况。然而加“\”再转义会降低代码的可读性(考虑一下一个全是\的字符串)。为了解决这类问题,C#这样的语言中引入了在字符串前面添加@来忽略这个字符串中的转义字符的特性,Javascipt中起类似功能的就是String.raw()。至于怎么用,我们先来看看MDN怎么说:
String.raw() 是一个模板字符串的标签函数,它的作用类似于 Python 中的字符串前缀
r
和 C# 中的字符串前缀@
(还是有点区别的,详见隔壁 Chromium 那边的这个 issue),是用来获取一个模板字符串的原始字符串的,比如说,占位符(例如${foo}
)会被处理为它所代表的其他字符串,而转义字符(例如\n
)不会。语法
String.raw(callSite, ...substitutions) String.raw`templateString`
参数
callSite
- 一个模板字符串的“调用点对象”。类似
{ raw: ['foo', 'bar', 'baz'] }
。...substitutions
- 任意个可选的参数,表示任意个内插表达式对应的值。
templateString
- 模板字符串,可包含占位符(
${...}
)。返回值
给定模板字符串的原始字符串。
异常
TypeError
- 如果第一个参数没有传入一个格式正确的对象,则会抛出
TypeError
异常。
MDN文档中提到的Chrome表现不一致的这个2016年的issue似乎已经解决了,可以自行console.log(String.raw`с:\x.js`);
看一下你的浏览器是否能正常输出"с:\x.js"
只是为了使JSON.parse()忽略转义序列的话,我们用其最基本的功能就行了:
JSON.parse(String.raw`{"data":"String\r\n\r\nraw"}`) //返回值:{data: "String↵↵raw"} let str = 'raw' JSON.parse(String.raw`{"data":"String\r\n\r\n${str}"}`) //返回值:{data: "String↵↵raw"}, //String.raw()依然会解释模板,所以结果应该和上面一样
不过,如果你已经在使用got这样的AJAX库的话,可能这些库已经在内部自动帮你解决了这些问题(不过多一个知识点也没什么错吧
Comments NOTHING