我注意声明一次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
只是一个痒我希望有人了解内部工作可以划伤。
答案 0 :(得分:2)
来自Mozilla spec:
您可以通过以下两种方式之一构建正则表达式:
使用正则表达式文字,其中包含斜杠之间的模式,如下所示:
var re = /ab+c/;
正则表达式文字在加载脚本时提供正则表达式的编译。如果正则表达式保持不变,使用它可以提高性能。
或者调用RegExp对象的构造函数,如下所示:
var re = new RegExp('ab+c');
使用构造函数提供正则表达式的运行时编译。当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数。
由于规范表明在使用文字语法时正在编译正则表达式,因此可以安全地假设它在那时被初始化为完整的,真正的正则表达式对象。
使用文字的另一个好处是可以实现正则表达式,这意味着如果在多个位置找到相同的正则表达式文字,则两个文字都可以引用同一个对象,从而节省了内存和初始化成本。