2012-06-14 66 views
10

既然你可以存储一个正则表达式中的变量如何比较两个正则表达式?

var regexp = /a/; 

为什么

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

甚至

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

都返回false

回答

19

试试这个:

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

,因为这两个是不同的对象你得到错误的。

7

“问题”:

regexobject - 一个引用类型,所以comparsion通过引用完成的,这是两个不同的对象。

​​

如果两个操作数都是对象,然后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对象,因此您创建了两个不同的对象(即使它们具有相同的“值”),但它们实际上有所不同吗?

+0

这不是一个猜测,它是正确的答案... +1 – gdoron

2

对于像int,string,boolean这样的原始数据类型,javascript知道要比较的内容,但对于日期或正则表达式这样的对象,操作符只查看内存中的位置,因为您独立地定义了正则表达式,它们在内存中有两个不同的地方所以他们不平等。