我在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
我不明白为什么会这样做。
答案 0 :(得分:15)
它们是两个不同的RegExp
个实例,因此通过直接将它们与==
或===
进行比较,您将比较两个不相等的引用,从而生成false
。
但是,当您比较他们的toString()
序列化或其来源时,您会按值比较他们的字符串表示。由于它们基本上是完全相同的模式和标志,因此比较它们的字符串表示将返回true
。
答案 1 :(得分:2)
以下是关于MDN的Comparison Operators文档的引用:
请注意,当且仅当对象被转换为对象时,该对象才会转换为基元 比较是原始的。 如果两个操作数都是对象,那么它们就是 作为对象进行比较,只有两个引用时,相等测试才为真 相同的对象。
new RegExp("\\w")
是一个对象,/\w/
也是。两者都单独实例化。需要我说更多吗?