Как сравнить два регулярных выражения?

Так как вы можете сохранить регулярное выражение в переменной

var regexp = /a/;

почему

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

и даже

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

оба возвращают false?

Ответ 1

Попробуйте следующее:

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

Вы получаете false, потому что эти два являются разными объектами.

Ответ 2

"Проблема":

regex является object - a ссылочным типом, поэтому сравнение выполняется по ссылке, и это два разных объекта.

console.log(typeof /a/); // "object"

Если оба операнда являются объектами, тогда JavaScript сравнивает внутренние ссылки, равные, когда операнды относятся к одному и тому же объекту в памяти.

MDN

Решение:

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

Live DEMO

Еще один "взломать", чтобы заставить toString() на regex es:

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

Ответ 3

Просто догадаться - но JavaScript не создает объект RegExp для вашего регулярного выражения, и потому, потому что вы создали два разных объекта (хотя они имеют одинаковое значение), они на самом деле разные?

Ответ 4

Для примитивных типов данных, таких как int, string, boolean javascript знает, что сравнивать, но для таких объектов, как date или regex, оператор только смотрит на место в памяти, потому что вы определяете свои регулярные выражения независимо, у них есть два разных места в памяти, поэтому они не равны.