2012-06-14 7 views
10

dato che è possibile memorizzare un'espressione regolare in una variabileCome confrontare due espressioni regolari?

var regexp = /a/; 

perché fanno

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

e anche

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

sia tornare false?

risposta

19

Prova questo:

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

hai trovato falso perché quei due sono diversi oggetti.

7

"problema":

regex è un object - tipo riferimento, quindi il comparsion è fatto da riferimento, e questi sono due oggetti differenti.

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

Se entrambi gli operandi sono oggetti, quindi JavaScript confronta riferimenti interni che sono uguali quando operandi riferiscono allo stesso oggetto in memoria.

MDN

Soluzione:

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

Live DEMO

Un altro "hack" per forzare il toString() sulle regex es è:

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

Solo un'ipotesi - ma JavaScript non crea un oggetto RegExp per la tua espressione regolare, e quindi perché hai creato due oggetti diversi (anche se hanno lo stesso "valore") in realtà sono diversi?

+0

Non è una supposizione, è la risposta giusta ... +1 – gdoron

2

Per i tipi di dati primitivi come int, string, boolean javascript sa cosa confrontare, ma per oggetti come data o regex l'operatore guarda solo il posto in memoria, perché si definiscono le espressioni regolari in modo indipendente hanno due diversi posti in memoria quindi non sono uguali.