为什么
console.log(/a/ == /a/);
和
var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);
都返回false
?
试试这个:
String(regexp1) === String(regexp2))
你得到假,因为这两个是不同的对象。
"问题":
regex
是一个object
- 一个引用类型,因此比较是通过引用完成的,它们是两个不同的对象。
console.log(typeof /a/); // "object"
如果两个操作数都是对象,那么当操作数引用内存中的同一对象时,JavaScript 会比较内部引用,这些内部引用是相等的。
多核
溶液:
var a = /a/;
var b = /a/;
console.log(a.toString() === b.toString()); // true! yessss!
现场演示
另一个强制toString()
regex
的"黑客"是:
console.log(a + "" === b + "");
只是一个猜测 - 但 JavaScript 不会为您的正则表达式创建一个RegExp
对象,因此因为您创建了两个不同的对象(即使它们具有相同的"值"),它们实际上是不同的?
对于像 int、string、布尔 JavaScript 这样的原始数据类型,javascript 知道要比较什么,但对于像 date 或正则表达式这样的对象,该运算符只查看内存中的位置,因为你独立定义你的正则表达式,它们在内存中有两个不同的位置,所以它们不相等。