How to compare two regexps?

Since you can store a regexp in a variable

var regexp = /a/;

why do

console.log(/a/ == /a/);

and even

var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);

both return false?

Answers


Try this:

String(regexp1) === String(regexp2))

You are getting false because those two are different objects.


"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.

MDN

Solution:

​var a = /a/;
var b = /a/;
console.log(​​​a.toString() === b.toString()); // true! yessss!

Live DEMO

Another "hack" to force the toString() on the regexes is:

console.log(a + "" === b + "");​

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?


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.


Need Your Help

No visible @interface for

objective-c ios xcode interface

I have gotten this error on several occasions and am unclear as to what causes the error in general. After looking for over an hour on stack overflow and google I still don't have an answer. Could

redirect_to from "destroy" to "index"

ruby-on-rails-3

Problem appears when I want to remove element from paginated table in "ajaxized" way. My tasks controller calls its destroy method in response to [DELETE] /tasks/1234, but at the end I want to redi...