Reputation: 48817
Why do
console.log(/a/ == /a/);
and
var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);
both return false
?
Upvotes: 31
Views: 16597
Reputation: 15535
Just a guess - but doesn't JavaScript create a RegExp
object for your regex, and therefore because you have created two different objects (even though they have the same "value") they're actually different?
Upvotes: 4
Reputation: 150263
"Problem":
regex
is an object
- a reference type, so the comparsion is done by reference, and those are two different objects.
console.log(typeof /a/); // "object"
If both operands are objects, then JavaScript compares internal references which are equal when operands refer to the same object in memory.
Solution:
var a = /a/;
var b = /a/;
console.log(a.toString() === b.toString()); // true! yessss!
Another "hack" to force the toString()
on the regex
es is:
console.log(a + "" === b + "");
Upvotes: 15
Reputation: 2527
For primitive data types like int, string, boolean javascript knows what to compare, but for objects like date or regex that operator only looks at the place in memory, because you define your regexes independently they have two different places in memory so they are not equal.
Upvotes: 2
Reputation: 16951
Try this:
String(regexp1) === String(regexp2))
You are getting false because those two are different objects.
Upvotes: 58