什么时候Javascript“初始化”一个RegEx模式?

时间:2017-06-27 18:22:12

标签: javascript regex

我注意声明一次RegEx模式并在可能的情况下重用,这是出于性能原因。我不完全确定为什么 - 多年前我可能读过的东西,并且已经被用于头骨海绵中。

我发现自己处于一个正则表达式的情况,并且发生了一个想法......确实宣布一个RegEx模式“实例化”或“初始化”该模式,或者它只是存储模式直到需要它?

var NonNumbers = /[^0-9]/g; //"initialized" here?
"h5u4i15h1iu".replace(NonNumbers, "*"); //or "initialized" here?

即使两个模式返回相同的结果,也许RegExp()实际创建了一个并且文字等待直到它被使用了?

var NonNumbers = /[^0-9]/g; //just stores the pattern
var NonNumbers = RegExp(/[^0-9]/, 'g'); //actually creates the RegExp

只是一个痒我希望有人了解内部工作可以划伤。

1 个答案:

答案 0 :(得分:2)

来自Mozilla spec

  

您可以通过以下两种方式之一构建正则表达式:

     

使用正则表达式文字,其中包含斜杠之间的模式,如下所示:

var re = /ab+c/;
     

正则表达式文字在加载脚本时提供正则表达式的编译。如果正则表达式保持不变,使用它可以提高性能。

     

或者调用RegExp对象的构造函数,如下所示:

var re = new RegExp('ab+c');
     

使用构造函数提供正则表达式的运行时编译。当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数。

由于规范表明在使用文字语法时正在编译正则表达式,因此可以安全地假设它在那时被初始化为完整的,真正的正则表达式对象。

使用文字的另一个好处是可以实现正则表达式,这意味着如果在多个位置找到相同的正则表达式文字,则两个文字都可以引用同一个对象,从而节省了内存和初始化成本。