为什么JavaScript中Regex.toString()与字符串字面量不相等?
为什么Regex.toString()的结果和字符串字面量不相等?
这个问题本质是字符串字面量和正则表达式的转义规则不一样,咱们掰碎了说就清楚了:
先看字符串字面量的解析逻辑:
当你写'/\.js$/'这种字符串的时候,里面的\是JS字符串的转义符,但\.并不是合法的转义序列(像\n换行、\t制表符才是正经转义)。JS遇到这种无效转义时,会直接忽略掉反斜杠,把它解析成普通的.。也就是说,这个字符串实际存的内容是"/.js$/"——你自己跑一下console.log('/\.js$/'),会发现输出的是/.js$/,反斜杠压根没了!再看正则的
toString()行为:
正则表达式/\.js$/里的\.是正则自己的转义,用来表示匹配字面量的点(不是正则里能匹配任意字符的通配符)。当调用toString()时,JS会把正则的源码原封不动地转换成字符串,所以得到的结果是"/\.js$/"——这里的反斜杠是真实存在的,打印出来能看到完整的/\.js$/。现在对比两者:
一个实际内容是"/.js$/"(没反斜杠),另一个是"/\.js$/"(有反斜杠),内容不一样,自然===比较返回false啦。那为啥两个
toString()结果相等?
两次调用/\.js$/.toString(),返回的都是那个带反斜杠的字符串,内容完全一致,所以比较结果就是true。
如果想让字符串字面量和正则toString()的结果相等,你需要把字符串里的反斜杠也转义一次(也就是写两个反斜杠):
const correctStr = '/\\.js$/'; console.log(correctStr === /\.js$/.toString()); // true
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

