Javascript 将regexp存储在变量vs中使用

Javascript 将regexp存储在变量vs中使用,javascript,regex,Javascript,Regex,最近,我一直对性能有点偏执(我读了那些可怕的编程文章),以至于我开始觉得存储和访问带有静态值的变量和在需要的地方使用该值之间存在着一点性能差异 例如: function check(name) { var match = name.match(/^Donald Middlename Trump$/i); if(!match) match = name.match(/^Hillary Mrs Clinton$/i); if(!match) match = name.matc

最近,我一直对性能有点偏执(我读了那些可怕的编程文章),以至于我开始觉得存储和访问带有静态值的变量和在需要的地方使用该值之间存在着一点性能差异

例如:

function check(name) {
    var match = name.match(/^Donald Middlename Trump$/i);
    if(!match) match = name.match(/^Hillary Mrs Clinton$/i);
    if(!match) match = name.match(/^Obama$/i);
    // e.t.c

    return match;
}
我对上述函数的偏执是(如果我错了,请纠正我,因为
/^$/=/^$///false
)我认为每次启动check函数时,都会为三个正则表达式创建一个RegExp对象的实例,因此Javascript每次都会花费一些时间来创建它。虽然每个正则表达式只使用一个地方,但我觉得通过创建一次正则表达式,然后从那里引用它,代码的性能会更好

例如

var trump = /^Donald Middlename Trump$/i,
    hillary = /^Hillary Mrs Clinton$/i,
    obama = /^Obama$/i;

function check(name) {
   var match = name.match(trump),
   if(!match) match = name.match(hillary);
   if(!match( match = name.match(obama);

   return match;
}
长话短说,访问变量和重新创建对象之间是否存在性能差异或好处

我对上述函数的偏执是(如果我错了,请纠正我,因为//$//=//$///false)我认为每次启动check函数时,都会为三个正则表达式创建一个RegExp对象的实例,因此JavaScript每次都会花费一些时间来创建它

每次调用函数时,引擎不再创建
RegExp
对象的新实例,而是创建编号
5
的新实例(如果该编号确实存在于函数中)

不要混淆解析和执行。代码只被解析一次。在解析时,将分析regexp并将其存储到内部表单(如果愿意,可以编译)


选择一种方法而不是另一种方法的唯一原因是可读性。

是的,存在性能差异,代码的工作方式也会不同(例如,当它出现时)。但是,不要对此产生偏执。您应该关注正确且可读的代码


如果这样做有任何相关的性能提升,请将其留给编译器。这是两个相对简单的优化,将自动完成。

@ibrahimmahrir不正确。@Hassan不正确。@ibrahimmahrir您将解析与执行混淆了。代码被解析一次。当代码被解析时,regexp被转换成一个内部形式正好一次。@torazaburo当我说解析时,我的意思是解析regexp而不是整个代码。但我认为你是对的。@ibrahimmahrir从技术上讲,“缓存”并不完全是正确的术语,但从概念上讲,它是在解析时预存储regexp文本的编译版本。@torazaburo我的意思是它做不同的事情,所以它将有不同的性能-不多也不少。我想这很容易让人误解,我不想表明性能优势。我不知道哪种代码会更快,也不知道差异是否显著(尽管我可以做出一个有根据的猜测),像往常一样,知道的唯一方法是基准测试。