27

为什么

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

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

两者都返回false

4

4 回答 4

48

尝试这个:

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

你是假的,因为这两个是不同的对象。

于 2012-06-14T12:12:45.263 回答
14

“问题”:

regexobject-a引用类型,因此比较是通过引用完成的,它们是两个不同的对象。

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

如果两个操作数都是对象,那么当操作数引用内存中的同一个对象时,JavaScript 会比较相等的内部引用。

MDN

解决方案:

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

现场演示

另一个强制es 的“hack”是toString()regex

console.log(a + "" === b + "");​
于 2012-06-14T12:13:00.987 回答
4

只是一个猜测-但JavaScript不会RegExp为您的正则表达式创建一个对象,因此因为您创建了两个不同的对象(即使它们具有相同的“值”)它们实际上是不同的?

于 2012-06-14T12:13:56.660 回答
2

对于像 int、string、boolean 这样的原始数据类型,javascript 知道要比较什么,但对于像 date 或 regex 这样的对象,运算符只查看内存中的位置,因为您独立定义正则表达式,它们在内存中有两个不同的位置,所以它们不是平等的。

于 2012-06-14T12:16:02.110 回答