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
なぜそうなるのかわかりません。
それらは2つの異なるRegExp
インスタンスであるため、それらを直接比較する==
か===
、2つの等しくない参照を比較すると、結果としてfalse
。
ただし、toString()
シリアル化またはソースのいずれかを比較すると、文字列表現を値で比較していることになります。それらは基本的にまったく同じパターンとフラグであるため、それらの文字列表現を比較すると。が返されtrue
ます。
以下は、 MDNの比較演算子のドキュメントからの引用です。
オブジェクトは、比較対象がプリミティブである場合にのみ、プリミティブに変換されることに注意してください。両方のオペランドがオブジェクトである場合、それらはオブジェクトとして比較され、両方が同じオブジェクトを参照する場合にのみ、同等性テストが true になります。
new RegExp("\\w")
はオブジェクトであり、そうです/\w/
。どちらも別々にインスタンス化されています。もっと言う必要がありますか?