-1

文字列内のすべての部分文字列を置き換えたい。
次の 2 つの例に違いはありますか?

var str='A horse walks into a bar and the bartender asks "Hey, why the long face?".';

str.replace(new RegExp('bar','g'),'restaurant');
// versus
str.replace(RegExp('bar','g'),'restaurant');

注:
これは単純化された例であり、上記とは異なり、文字列を連結するには、リテラル正規表現の代わりに RegExp を使用する必要があります。

4

2 に答える 2

1

RegExp関数が何をするかについての仕様を読んでください:

15.10.3 関数として呼び出される RegExp コンストラクター

pattern が、[[Class]] 内部プロパティが "RegExp" であり、flags が定義されていないオブジェクト R である場合、R を変更せずに返します。それ以外の場合は、標準の組み込み RegExp コンストラクター (15.10.4.1)を式 new RegExp( pattern, flags) によるかのように呼び出し、そのコンストラクターによって構築されたオブジェクトを返します。

15.10.4 正規表現コンストラクタ

RegExp が新しい式の一部として呼び出されると、コンストラクターになります。つまり、新しく作成されたオブジェクトを初期化します。

pattern が、[[Class]] 内部プロパティが "RegExp" で、flags が定義されていないオブジェクト R である場合、P を R の構築に使用されるパターンとし、F を R の構築に使用されるフラグとします。pattern がオブジェクト R の場合[[Class]] 内部プロパティが "RegExp" で、flags が未定義でない場合、TypeError 例外をスローします。それ以外の場合、pattern が未定義の場合は P を空の文字列、それ以外の場合は ToString(pattern) とし、flags が未定義の場合は F を空の文字列とし、それ以外の場合は ToString(flags) とします。

[…そしてパターンから正規表現を構築]

したがって、実際には違いはありません。の型をnewチェックする必要があるため、なしでは遅くなる可能性があります。単純な関数呼び出しの代わりに追加の new 式があるため、遅くなる可能性があります。Rnew

例の実際のパフォーマンス測定でも、違いに気付かないと思います。

于 2013-01-23T11:59:55.777 に答える
0

関数が呼び出した場合、RegEx関数の内部が効果的に機能するかどうかはわかりませんthisが、新しいアイテムではなくグローバルオブジェクトが使用されます。

パフォーマンスに関しては同じですが、複数の正規表現を使用している場合、グローバル オブジェクトの変数が置き換えられるため、互いに競合する可能性があります。

どちらの呼び出しも推奨される方法ではなく、構文は次のとおりです。 str.replace(/bar/g,'restaurant');

この例の場合、以下も機能します。

var myRegex = /bar/g;
str.replace(myRegex,'restaurant');
于 2013-01-23T11:53:17.863 に答える