我最近遇到了这段 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/