检查字符串的最快方法是在JavaScript中包含另一个子字符串?

时间:2011-03-14 08:26:07

标签: javascript regex substring

我正在处理JavaScript上的性能问题。所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码段?

8 个答案:

答案 0 :(得分:289)

你有两个可能性:

  1. Regular expression

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

    str.indexOf('word') !== -1
    
  3. Regular expressions seem to be faster(至少在Chrome 10中)。

    Performance test - short haystack
    Performance test - long haystack

    <小时/> 2011年更新:

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

    你必须看到并为自己尝试。这取决于您的需求。例如,对于正则表达式,不区分大小写的搜索会更快。


    更新2018年:

    为了避免人们自己运行测试,以下是大多数常见浏览器的当前结果,百分比表示下一个最快结果的性能提升(因浏览器而异):

    Chrome: indexOf(快〜98%)<-- wow
    Firefox:缓存RegExp(速度提高约18%)
    IE11:缓存RegExp(速度提高约10%)
    边缘: indexOf(快〜18%)
    Safari:缓存RegExp(速度提高约0.4%)

    请注意,缓存的RegExp 为:var r = new RegExp('simple'); var c = r.test(str);,而不是:/simple/.test(str)

答案 1 :(得分:17)

这对你有用吗?

string1.indexOf(string2) >= 0

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

编辑2:当字符串很长和/或包含重复模式时,RegExp可能比indexOf更快。请参阅评论和@Felix的答案。

答案 2 :(得分:8)

我发现使用简单的for循环,迭代字符串中的所有元素并使用charAt进行比较的速度比indexOfRegex快。代码和证明可在JSPerf获得。

根据jsperf.com上列出的浏览器范围数据,ETA:indexOfcharAt在Chrome Mobile上的表现同样糟糕

答案 3 :(得分:7)

在ES6中,includes()方法用于确定是否可以在另一个字符串中找到一个字符串,并根据需要返回info.plist$(MYAPP_DISPLAY_NAME)

true

之间是jsperf
false

并且

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中显示的结果,它们似乎都表现良好。

答案 4 :(得分:3)

为了找到一个简单的字符串,使用indexOf()方法并使用正则表达式几乎是相同的:http://jsperf.com/substring - 所以选择哪一个似乎更容易编写。

答案 5 :(得分:3)

最快

  1. (ES6)包含
    var string = "hello",
    substring = "lo";
    string.includes(substring);
  1. ES5和更低版本的 indexOf
    var string = "hello",
    substring = "lo";
    string.indexOf(substring) !== -1;

http://jsben.ch/9cwLJ

enter image description here

答案 6 :(得分:2)

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

答案 7 :(得分:1)

使用.match()方法将字符串简单化。

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)));
希望你过得愉快,先生!