为什么要这样做?
console.log(/a/ == /a/);
和
var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);
两者都返回false
?
console.log(/a/ == /a/);
和
var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);
两者都返回false
?
试试这个:
String(regexp1) === String(regexp2))
你得到 false 是因为这两个对象是不同的。
问题:
regex
是一个引用类型的object
,因此比较是按照引用进行的,这两个对象是不同的。
console.log(typeof /a/); // "object"
如果两个操作数都是对象,则 JavaScript 比较内部引用,当操作数在内存中引用同一对象时相等。var a = /a/;
var b = /a/;
console.log(a.toString() === b.toString()); // true! yessss!
强制执行regex
的toString()
的另一种“hack”方法是:
console.log(a + "" === b + "");
对于像int、string、boolean这样的原始数据类型,JavaScript知道如何进行比较,但对于像日期或正则表达式这样的对象,该运算符只查看内存中的位置,因为您独立定义了正则表达式,它们在内存中有两个不同的位置,所以它们是不相等的。
new
来创建字符串,你需要调用valueOf
方法,因为它会创建一个对象(而不是原始的字符串字面量)- 例如:(new String(regexp1)).valueOf() === (new String(regexp2)).valueOf() - Shaun