JavaScript は関数内の正規表現リテラルをどのくらいの頻度で再コンパイルしますか? 質問する

JavaScript は関数内の正規表現リテラルをどのくらいの頻度で再コンパイルしますか? 質問する

この関数を考えると:

function doThing(values,things){
  var thatRegex = /^http:\/\//i; // is this created once or on every execution?
  if (values.match(thatRegex)) return values;
  return things;
}

JavaScript エンジンはどのくらいの頻度で正規表現を作成する必要がありますか? 実行ごとに 1 回ですか、それともページの読み込み/スクリプトの解析ごとに 1 回ですか?

不必要な回答やコメントを防ぐために、私は個人的に正規表現を関数内ではなく関数外に置くことを好みます。質問は言語の動作に関するもので、どこで調べればよいか、またはこれがエンジンの問題であるかどうかはわかりません。


編集:

これをループで使用することを言及していなかったことに気付きました。申し訳ありません。

var newList = [];
foreach(item1 in ListOfItems1){ 
  foreach(item2 in ListOfItems2){ 
    newList.push(doThing(item1, item2));
  }
}

したがって、ループ内で何度も使用されることを考えると、関数の外で正規表現を定義するのは理にかなっています。

また、このスクリプトは、正規表現の作成の動作とコストのみを調べる目的で汎用化されていることにも注意してください。

ベストアンサー1

からMozilla の JavaScript ガイド正規表現について:

正規表現リテラルは、スクリプトが評価されるときに正規表現のコンパイルを提供します。正規表現が一定のままである場合は、パフォーマンスを向上させるためにこれを使用します。

そして、ECMA-262 仕様、§7.8.5 正規表現リテラル:

正規表現リテラルは、リテラルが評価されるたびに RegExp オブジェクト (15.10 を参照) に変換される入力要素です。

つまり、スクリプトが最初に解析されるときに評価されるときに、一度コンパイルされます。

ES5の仕様からも注目すべきは、2つのリテラルコンパイルすると2つの異なるインスタンスRegExp、たとえリテラル自体が同じであっても。したがって、特定のリテラルがスクリプト内に 2 回出現する場合、2 つの異なるインスタンスに 2 回コンパイルされます。

プログラム内の 2 つの正規表現リテラルは、たとえ 2 つのリテラルの内容が同一であっても、互いに === として比較されることのない正規表現オブジェクトに評価されます。

...

... リテラルが評価されるたびに、式によって作成されたかのように新しいオブジェクトが作成されますnew RegExp(Pattern, Flags)。ここで、RegExp はその名前を持つ標準の組み込みコンストラクターです。

おすすめ記事