为什么 Regex.toString() 不等于 javascript 中的字符串文字

Why Regex.toString() not equal to string literals in javascript

console.log(/\.js$/.toString() === '/\.js$/') // false
// or
console.log(/\.js$/.toString() == '/\.js$/') // false
   
// but
console.log(/\.js$/.toString()) // /\.js$/
console.log(/\.js$/.toString() === /\.js$/.toString()) // true

\ 是字符串文字中用于转义下一个字符的特殊字符。使用其中的 2 个。

console.log(/\.js$/.toString() === '/\.js$/') // true

因为当转换成字符串时,\的含义发生了变化。在字符串中,它用于转义字符,例如\n\t。在正则表达式中,这意味着按字面意义获取下一个字符,例如 . 在您的情况下。因此,当转换为字符串时 \ 必须进行转义,因此 /\.js$/ 变为 "/\.js$/"。请注意,如果您随后将其输入 RegExp 构造函数,则 "\.js$" 将有效,而 "\.js$" 将具有不同的含义,并被解释为 /.js$/

因为js中的字符串'/\.js$/'becomes /.js$/ this happens because '.'其实就是转义字符.

所以基本上你是在比较 '/\.js$/' 和 /.js$/ 是不同的字符串。

要获得相同的字符串,您需要通过将字符串文字更改为 '/\.js$/'

来转义 /

看看你自己的区别,console.log(/\.js$/.toString()); 打印 /\.js$/console.log('/\.js$/'); 打印 \.js$/ 这显然是不同的。(所以你得到 false 因为两个字符串都不同)

console.log(/\.js$/.toString());
console.log('/\.js$/');