2012-06-14 43 views
10

ya que se puede almacenar una expresión regular en una variable¿Cómo comparar dos expresiones regulares?

var regexp = /a/; 

¿por qué

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

e incluso

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

ambos devuelven false?

Respuesta

19

Prueba esto:

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

que está recibiendo falso, porque los dos son diferentes objetos.

7

"problema":

regex es un object - un tipo referencia, por lo que el comparsion se hace por referencia, y esos son dos objetos diferentes.

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

Si ambos operandos son objetos, entonces JavaScript compara referencias internas que son iguales cuando operandos se refieren al mismo objeto en la memoria.

MDN

Solución:

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

Live DEMO

Otro "hack" para forzar la toString() en los regex es es:

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

Solo supongo, pero JavaScript no crea un objeto RegExp para su expresión regular, y por lo tanto, debido a que ha creado dos objetos diferentes (a pesar de que tienen el mismo "valor") en realidad son diferentes?

+0

No es una suposición, es la respuesta correcta ... +1 – gdoron

2

Para tipos de datos primitivos como int, string, booleano javascript sabe qué comparar, pero para objetos como date o regex ese operador solo mira el lugar en la memoria, porque usted define sus expresiones regulares de forma independiente tienen dos lugares diferentes en la memoria entonces ellos no son iguales

Cuestiones relacionadas