最快的方式来检查一个string包含JavaScript中的另一个子string?

我正在处理JavaScript的性能问题。 所以我只想问:检查一个string是否包含另一个子string(我只需要布尔值)的最快方法是什么? 你能否build议你的想法和样片段代码?

你有两个可能性:

  1. 正则expression式 :

     (new RegExp('word')).test(str) // or /word/.test(str) 
  2. indexOf

     str.indexOf('word') !== -1 

正则expression式似乎更快 (至less在Chrome 10中)。

性能testing – 简短的草垛
性能testing – 漫长的干草堆

更新:

不能肯定地说哪种方法更快。 浏览器之间的差异是巨大的。 在Chrome 10中, indexOf似乎更快,但在Safari 5中, indexOf明显比任何其他方法都要慢。

你必须看到和尝试自我。 这取决于你的需求。 例如,对于正则expression式来说, 不区分大小写的search更快。

这对你有用吗?

 string1.indexOf(string2) >= 0 

编辑:如果string2包含重复模式,这可能不会比RegExp更快。 在某些浏览器上,indexOf可能比RegExp慢得多。 看评论。

编辑2:当string非常长和/或包含重复的模式时,RegExp可能比indexOf更快。 见评论和@ Felix的答案。

我发现使用一个简单的for循环,遍历string中的所有元素,并使用charAt执行比indexOfRegex更快。 代码和certificate可在JSPerf上find 。

ETA: indexOfcharAt在Chrome Mobile上的performance都差不多,根据jsperf.com上列出的Browser Scope数据

为了find一个简单的string,使用indexOf()方法和使用正则expression式几乎是相同的: http : //jsperf.com/substring – 所以select哪一个似乎更容易编写。

在ES6中, includes()方法用于确定在另一个string中是否可以find一个string,并根据需要返回truefalse

 var str = 'To be, or not to be, that is the question.'; console.log(str.includes('To be')); // true console.log(str.includes('question')); // true console.log(str.includes('nonexistent')); // false 

这里是jsperf之间

 var ret = str.includes('one'); 

 var ret = (str.indexOf('one') !== -1); 

正如jsperf所显示的结果,似乎他们都performance良好。

我为你做了一个jsben.ch http://jsben.ch/#/aWxtF …似乎indexOf有点快。

使用.match()方法进行string的简单方法。

 var re = /(AND|OR|MAYBE)/; var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING"; console.log('Do we found something?', Boolean(str.match(re))); 

先生,祝你有美好的一天!