2012-06-14 28 views
10

Ponieważ można przechowywać w zmiennej regexpJak porównać dwa wyrazy regularne?

var regexp = /a/; 

dlaczego

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

a nawet

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

zarówno powrócić false?

Odpowiedz

19

Spróbuj tego:

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

Otrzymujesz fałszywe, ponieważ te dwa różne obiekty.

7

"problem":

regex jest object - rodzaj odniesienia, więc comparsion odbywa się poprzez odniesienie, a to są dwa różne obiekty.

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

Jeśli oba operandy są obiektami, a następnie porównuje JavaScript odniesień wewnętrznych, które są równe, gdy argumenty odnoszą się do tego samego obiektu w pamięci.

MDN

Rozwiązanie:

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

Live DEMO

Kolejny "hack" zmusić toString() na regex ES:

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

tylko domyślać - ale nie JavaScript stworzyć RegExp obiekt dla regex i dlatego, ponieważ stworzyli dwa różne obiekty (choć mają taką samą „wartość”) są rzeczywiście różne?

+0

nie jest to przypuszczenie, to właściwą odpowiedź ... +1 – gdoron

2

Dla pierwotnych typów danych, takich jak int, string, boolean javascript wie, co porównywać, ale dla obiektów takich jak date lub regex ten operator patrzy tylko na miejsce w pamięci, ponieważ definiujesz swoje regexes niezależnie mają dwa różne miejsca w pamięci więc nie są równi.

Powiązane problemy