7

我在 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

我不明白为什么会这样。

4

2 回答 2

15

它们是两个不同的RegExp实例,因此通过直接将它们与==or===你比较两个不相等的引用,导致false.

但是,当您比较它们的toString()序列化或源时,您是在按值比较它们的字符串表示形式。由于它们基本上是完全相同的模式和标志,因此比较它们的字符串表示将返回true.

于 2012-08-25T19:20:35.473 回答
2

这是MDN 上比较运算符文档引用:

请注意,当且仅当其比较对象是原始对象时,对象才会转换为原始对象。如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两个操作数都引用同一个对象时,相等性测试才为真。

new RegExp("\\w")是一个对象, 也是/\w/。两者分别实例化。需要我多说?

于 2012-08-25T21:54:04.443 回答