在大多数编程语言中,反斜杠,即“\”,是一个特殊的字符,具体来说是一个转义字符,它常与其他字符组合来表示另一个特殊字符,如“\t”表示制表符,“\n”表示换行符,“\r”表示回车符等等。
图1 换行符
1、特殊字符:\
当然,反斜杠也可能出现“单独使用”的情况,比如一个随机生成的字符串中,其长度为190,不过需要注意的是,此时反斜杠表示的是一个普通的字符,而不是特殊字符。
E1eo0pcDzt\kELI4NxGrwD/cxgxGcCHnj\J5veAX5cEHfq8e5PxLlVzd5zY8raccb1eomKiGLS2eU7dypxUHWOWkdhIUoBpr\bLBrNDlgziQweg0wBIL+zDT7Ld\07ttX0B98TVNIzAb74mNgR4AxIisiG+XkNiy7Bi2mUf0waW3+QYM:1732172257549
图2 随机生成的带反斜杠的字符串
如果将该字符串直接复制到其他地方时,可能会引发问题。
以浏览器控制台为例,复制后赋值给变量str1。
图3 变量str1
当获取该字符串的长度时,发现已经不是原来的190。
图4 输出变量str1的长度
与原来的字符串相比,不难发现,str1字符串中有些反斜杠消失,有些反斜杠还存在。
图5 “消失”与“存活”的反斜杠
这是由于反斜杠是一个特殊字符的缘故,它不能单独使用,即反斜杠在控制台与声明变量时所表示的意义不同。
将复制的字符串赋值给变量str1时,js语法解析器会尝试将反斜杠与其相邻的下一个字符解析为一个特殊字符。
以字符串中的第一个反斜杠“Hnj\J5ve”为例:显然,“\J”并不是一个有效的特殊字符,因此该反斜杠会被移除,只剩下一个“J”;在第二个反斜杠“pr\bLB”中,“\b”可以表示特殊字符,代表单词的边界,因此反斜杠会被保留下来,但“\b”也只表示一个字符,这是赋值后字符串长度变短的原因。
所以很明显,如果此时将字符串用于参数校验的话,无疑会失败。
2、普通字符:\
处理该问题也简单,仅需要将字符串按照它原本的意义表示即可,也就是说,反斜杠原来是一个普通字符,赋值后,它应该也还是一个普通字符。
目前已知的方法有两种:
1、将控制台的字符串先复制到编辑器中,再从编辑器复制到浏览器
有些编辑器会智能识别反斜杠字符,并为其加上转义字符,如JetBrains系列编辑器。
图6 经编辑器处理后的字符
2、使用String.raw()方法
如方法名字面意思,使用该方法处理字符串时,字符串不会发生转义。一般情况下,其他语言也会有类似的字符串处理接口。
图7 变量str2
不得不说,平时确实会为了图方便,而将控制台的输出结果直接复制并拿去赋值,继而引发该错误,不过问题也不大,只要知道原因所在即可。
同时,本文也是作者在某个参数校验过程中发生了小插曲后的产物,以此为戒。