0

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
Allen
  • 4,431
  • 2
  • 27
  • 39

4 Answers4

3

Because when converted to a string, the meaning of \ changes. In a string, it is used to escape characters, such as \n and \t. In a regex, it means to take the next character literally, such as . in your case. Thus, when converted to a string \ must be escaped, so /\.js$/ becomes "/\\.js$/". Note that if you then feed this into the RegExp constructor, "\\.js$" would be valid, whereas "\.js$" would have a different meaning, and be interpreted as /.js$/

treyhakanson
  • 4,611
  • 2
  • 16
  • 33
1

\ is a special char in string literals to escape the next char. Use 2 of them.

console.log(/\.js$/.toString() === '/\\.js$/') // true
Daniel A. White
  • 187,200
  • 47
  • 362
  • 445
1

Because the string '/\.js$/'becomes /.js$/ this happens because '.' in js is actualy the scaped character .

So basically you are comparing '/\.js$/' with /.js$/ that are different strings.

to achieve get the same strings you need to escape the / by changing your string literal to '/\\.js$/'

1

See the difference your self, console.log(/\.js$/.toString()); prints /\.js$/ while console.log('/\.js$/'); prints \.js$/ which is obviously different.(so you are getting false as both string are different)

console.log(/\.js$/.toString());
console.log('/\.js$/');
yajiv
  • 2,901
  • 2
  • 15
  • 25