Ответ 1
Попробуйте следующее:
String(regexp1) === String(regexp2))
Вы получаете false, потому что эти два являются разными объектами.
Так как вы можете сохранить регулярное выражение в переменной
var regexp = /a/;
почему
console.log(/a/ == /a/);
и даже
var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);
оба возвращают false
?
Попробуйте следующее:
String(regexp1) === String(regexp2))
Вы получаете false, потому что эти два являются разными объектами.
"Проблема":
regex
является object
- a ссылочным типом, поэтому сравнение выполняется по ссылке, и это два разных объекта.
console.log(typeof /a/); // "object"
Если оба операнда являются объектами, тогда JavaScript сравнивает внутренние ссылки, равные, когда операнды относятся к одному и тому же объекту в памяти.
Решение:
var a = /a/;
var b = /a/;
console.log(a.toString() === b.toString()); // true! yessss!
Еще один "взломать", чтобы заставить toString()
на regex
es:
console.log(a + "" === b + "");
Просто догадаться - но JavaScript не создает объект RegExp
для вашего регулярного выражения, и потому, потому что вы создали два разных объекта (хотя они имеют одинаковое значение), они на самом деле разные?
Для примитивных типов данных, таких как int, string, boolean javascript знает, что сравнивать, но для таких объектов, как date или regex, оператор только смотрит на место в памяти, потому что вы определяете свои регулярные выражения независимо, у них есть два разных места в памяти, поэтому они не равны.