为什么 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$/');
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$/');