4

Chrome のコンソール/(?:)/に RegExp のプロトタイプが表示されるのはなぜですか?

console.log(RegExp.prototype);
console.log(/a/.__proto__);

これは実装固有のものですか?IEが表示されて//います。

これはただの好奇心からの質問です。これに遭遇したとき、javascriptで正規表現のすべてのプロトタイプメソッドを表示しようとしました。もちろん、それらの方法を調べる別の方法も見つけましたが、なぜこの結果が表示されるのか疑問に思っています。

この質問が以前に尋ねられたことがないことを願っています-Stackoverflowで何も見つかりませんでした。ありがとう!

4

1 に答える 1

6

仕様の関連セクション

RegExp プロトタイプ オブジェクト自体が正規表現オブジェクトです。その [[Class]] は「RegExp」です。RegExp プロトタイプ オブジェクトのデータ プロパティ (15.10.7) の初期値は、オブジェクトが式 new RegExp() によって作成されたかのように設定されます。ここで、RegExp はその名前の標準組み込みコンストラクターです。

new RegExp()それからsectionに行きます。これは空の文字列で呼び出すのと同じです。これで、プロトタイプとして空の正規表現オブジェクトができました。

文字列表現は次のように定義されます

文字列 "/"、この RegExp オブジェクトのソース プロパティの文字列値、および "/" を連結して形成された文字列値を返します。グローバル プロパティが true の場合は "g"、ignoreCase プロパティが true の場合は "i"、複数行プロパティが true の場合は "m" を加えたもの。

注意 返された String は、このオブジェクトと同じ動作を持つ別の RegExp オブジェクトに評価される RegularExpressionLiteral の形式を持っています。

最終的には.sourceプロパティ (新しい RegExp セクションで説明) に帰着します。これは、正規表現として使用した場合と同じように動作する限り、実装定義です。

S を P と同等のパターンの形式の文字列とし、以下で説明するように特定の文字をエスケープします。S は、P またはパターンと同一である場合と同一でない場合があります。ただし、S をパターンとして評価した結果生じる内部手続きは、構築されたオブジェクトの [[Match]] 内部プロパティによって与えられる内部手続きと同じように動作する必要があります。

new RegExp("(?:)")と の動作は同じであるためnew RegExp("")、chrome と IE の両方が正しく仕様に従っています。仕様では、例としてこの特定の状況についても言及しています。

P が空の文字列の場合、S を "(?:)" にすることでこの仕様を満たすことができます。

Chromeの方法は、正規表現リテラルとしても機能するように見えるため、「より良い」と見なすことができます。/(?:)/有効な正規表現リテラルです//が、1行のコメントを開始します。

于 2013-08-19T13:00:24.937 に答える