根据MDN's RegExp Guide编译正则表达式文字,而通过调用构造函数创建的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);
是否有任何想法是否被任何JavaScript引擎在实践中使用?
答案 0 :(得分:3)
MDN docs明确指出:
文字表示法在计算表达式时提供正则表达式的编译。
和
正则表达式对象的构造函数,例如,新的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);
这会产生:
147
118
显然,我的测试(Chrome)
的构造函数更快同样在你的测试中,你根本没有测试构造函数。您只是将第一个测试中的文字分配给变量名称。基本上测试是相同的。