JavaScript 样式/优化 : String. indexOf() v. Regex.test()

标签 javascript regex optimization coding-style

我最近遇到了这段 JavaScript 代码:

if (",>=,<=,<>,".indexOf("," + sCompOp + ",") != -1)

我很感兴趣,因为要编写这个测试我会这样做:

if (/(>=|<=|<>)/.test(sCompOp))

这只是风格上的差异,还是其他代码的作者了解一些我不知道的优化知识?或者也许有不同的充分理由这样做,或者不使用正则表达式......?

在我看来,为此使用 String.indexOf() 有点难以阅读(但是,我对正则表达式很满意),但是有没有实例可能比编写等效的正则表达式“更好”?

通过可能更快或更有效的“更好”(尽管显然这取决于浏览器的 JavaScript 引擎)或其他一些我不知道的原因。谁能赐教一下?

最佳答案

我进行了一些测试。第一种方法稍微快一些,但即使在大量使用的情况下也不足以产生任何真正的区别... except sCompOp 可能是一个很长的字符串。因为第一种方法搜索的是定长字符串,无论sCompOp多长执行时间都非常稳定,而第二种方法可能会遍历sCompOp的整个长度>.

另外,第二种方法可能会匹配无效的字符串——“blah blah blah <= blah blah”满足测试...

鉴于您可能会在其他地方解析运算符,我怀疑这两种极端情况都会成为问题。但即使情况并非如此,对表达式的一个小修改也可以解决这两个问题:

/^(>=|<=|<>)$/

测试代码:

function Time(fn, iter)
{
   var start = new Date();
   for (var i=0; i<iter; ++i)
      fn();
   var end = new Date();
   console.log(fn.toString().replace(/[\r|\n]/g, ' '), "\n : " + (end-start));
}

function IndexMethod(op)
{
   return (",>=,<=,<>,".indexOf("," + op + ",") != -1);
}

function RegexMethod(op)
{
   return /(>=|<=|<>)/.test(op);
}

function timeTests()
{
   var loopCount = 50000;
   
   Time(function(){IndexMethod(">=");}, loopCount);
   Time(function(){IndexMethod("<=");}, loopCount);
   Time(function(){IndexMethod("<>");}, loopCount);
   Time(function(){IndexMethod("!!");}, loopCount);
   Time(function(){IndexMethod("the quick brown foxes jumped over the lazy dogs");}, loopCount);
   Time(function(){IndexMethod("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");}, loopCount);

   Time(function(){RegexMethod(">=");}, loopCount);
   Time(function(){RegexMethod("<=");}, loopCount);
   Time(function(){RegexMethod("<>");}, loopCount);
   Time(function(){RegexMethod("!!");}, loopCount);
   Time(function(){RegexMethod("the quick brown foxes jumped over the lazy dogs");}, loopCount);
   Time(function(){RegexMethod("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");}, loopCount);
}

timeTests();

在 IE6、FF3、Chrome 0.2.149.30 中测试

关于JavaScript 样式/优化 : String. indexOf() v. Regex.test(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/183496/

相关文章:

java - 简单的电子邮件验证

c++ - 将类型解析为 class::typedef 的更短方法

java - 检查应用程序何时启动?

optimization - 优化如何使 valgrind 误报?

javascript - 空时用jquery隐藏单元格(无内容)

java - 使用 Regex 和 DefaultTableModel 将值插入到 JTable 中

javascript - 具有动态经度和纬度的 Algolia 地理搜索 - 距离不正确

regex - 使用正则表达式匹配1到105之间的数字

javascript - React 状态下错误 "Cannot read property ' fname' of undefined"

javascript - jquery - 具有多个元素的可变选项的 html()?