1

次のコード スニペット (Crockford のJavascript: The Good Partsから) は、正規表現リテラルによって作成された RegExp オブジェクトが単一のインスタンスを共有することを示しています。

function make_a_matcher( ) {
    return /a/gi;
}

var x = make_a_matcher( );
var y = make_a_matcher( );

// Beware: x and y are the same object!

x.lastIndex = 10;

document.writeln(y.lastIndex); // 10

質問: これは他のリテラルでも同じですか? 上記のコードを文字列"string"で動作するように変更しようとしましたが、大量のエラーが発生しました。

4

1 に答える 1

4

いいえ、共有されません。正規表現リテラルの仕様から:

正規表現リテラルは、リテラルが評価されるたびに RegExp オブジェクト (15.10 を参照) に変換される入力要素です。プログラム内の 2 つの正規表現リテラルは、2 つのリテラルの内容が同一であっても、互いに === として比較されることのない正規表現オブジェクトとして評価されます。

ただし、これは ES5 で変更されました。古い ECMAScript 3の動作は異なります。

正規表現リテラルは、スキャン時にRegExp オブジェクト (セクション 15.10) に変換される入力要素です。オブジェクトは、それを含むプログラムまたは関数の評価が開始される前に作成されます。リテラルを評価すると、そのオブジェクトへの参照が生成されます。新しいオブジェクトは作成されません。プログラム内の 2 つの正規表現リテラルは、2 つのリテラルの内容が同一であっても、互いに === として比較されることのない正規表現オブジェクトとして評価されます。

これは、評価全体で正規表現エンジンのコンパイル結果を共有することになっていましたが、明らかにバグのあるプログラムにつながりました。

本を捨てて、新しい版を手に入れるべきです。

于 2015-01-28T03:16:36.267 に答える