我在 Chrome 的控制台中尝试了以下操作:
var r1 = new RegExp("\\w"); // → /\w/
var r2 = /\w/; // → /\w/
r1 === r2; // → false
r1 == r2; // → false
r1.toString() === r2.toString(); // → true
r1.source === r2.source; // → true
我不明白为什么会这样。
我在 Chrome 的控制台中尝试了以下操作:
var r1 = new RegExp("\\w"); // → /\w/
var r2 = /\w/; // → /\w/
r1 === r2; // → false
r1 == r2; // → false
r1.toString() === r2.toString(); // → true
r1.source === r2.source; // → true
我不明白为什么会这样。
它们是两个不同的RegExp
实例,因此通过直接将它们与==
or===
你比较两个不相等的引用,导致false
.
但是,当您比较它们的toString()
序列化或源时,您是在按值比较它们的字符串表示形式。由于它们基本上是完全相同的模式和标志,因此比较它们的字符串表示将返回true
.
这是MDN 上比较运算符文档的引用:
请注意,当且仅当其比较对象是原始对象时,对象才会转换为原始对象。如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两个操作数都引用同一个对象时,相等性测试才为真。
new RegExp("\\w")
是一个对象, 也是/\w/
。两者分别实例化。需要我多说?