什么时候编译 JavaScript 正则表达式文字

Joh*_*kic 5 javascript regex performance compilation

根据MDN 的 RegExp 指南,正则表达式文字被编译,而通过调用构造函数创建的 RegExp 对象不是。

我现在的问题是,什么时候进行编译?由于文字具有独特的语法,因此在解析过程中将其标识为正则表达式。这将使编译一次并在每次评估时重用结果成为可能,从而导致两个示例具有(几乎)相同的速度。

var str = "Hello World";

// Example 1
var regExp1 = /[aeiou]+/gi;
for(var i = 0; i < 1000; ++i)
    regExp1.exec(str);

// Example 2
for(var j = 0; j < 1000; ++j)
    /[aeiou]+/gi.exec(str);
Run Code Online (Sandbox Code Playgroud)

任何 JavaScript 引擎在实践中是否使用它的任何想法?

tsi*_*kov 5

MDN文档明确指出:

文字表示法在计算表达式时提供正则表达式的编译。

正则表达式对象的构造函数,例如new RegExp("ab+c"),提供正则表达式的运行时编译

你做的测试不是很清楚。您在哪里衡量绩效?我认为它们应该是这样制作的:

start = new Date();
for(var j = 0; j < 1000000; ++j)
    /[aeiou]+/gi.exec(str);
console.log(new Date - start);

start = new Date();
regex = new RegExp("[aeiou]+", "gi");
for(var j = 0; j < 1000000; ++j)
    regex.exec(str);
console.log(new Date - start);
Run Code Online (Sandbox Code Playgroud)

这会产生:

147
118
Run Code Online (Sandbox Code Playgroud)

显然,从我的测试来看,构造函数更快(Chrome)

另外,在您的测试中,您根本没有测试构造函数。您只是将第一个测试中的文字分配给变量名称。基本上测试是相同的。