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

在JavaScript中检查字符串是否包含另一个子字符串的最快方法?,javascript,regex,substring,Javascript,Regex,Substring,我正在处理JavaScript的性能问题。所以我只想问:检查一个字符串是否包含另一个子字符串(我只需要布尔值)的最快方法是什么?您能提出您的想法和示例代码吗?这对您有用吗 string1.indexOf(string2) >= 0 编辑:如果string2包含重复的模式,这可能不会比RegExp快。在某些浏览器上,indexOf可能比RegExp慢得多。见评论 编辑2:当字符串很长和/或包含重复模式时,RegExp可能比indexOf快。请参阅评论和@Felix的答案。您有三种可能: :

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

这对您有用吗

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


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

您有三种可能:

  • :

  • :

  • :

  • (至少在铬10中)



    **2011年更新:** 不能肯定地说哪种方法更快。浏览器之间的差异是巨大的。在Chrome10中,
    indexOf
    似乎更快,而在Safari5中,
    indexOf
    显然比任何其他方法都慢

    你必须为你自己去看和尝试。这取决于你的需要。例如,使用正则表达式进行不区分大小写的搜索要快得多


    2018年更新:

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


    Chrome:indexOf(~98%的速度)
    查找简单字符串时,使用indexOf()方法和使用regex几乎是一样的:-所以选择哪一个似乎更容易编写。

    使用
    方法匹配字符串是一种简单的方法

    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)));
    

    祝您今天愉快,先生

    我发现使用一个简单的for循环,迭代字符串中的所有元素并使用
    charAt
    进行比较,比
    indexOf
    Regex
    执行得更快。代码和证明可在以下网址获得:

    ETA:
    indexOf
    charAt
    在Chrome Mobile上的表现同样糟糕。根据jsperf.com上列出的浏览器范围数据,在ES6中,该方法用于确定是否可以在另一个字符串中找到一个字符串,并根据情况返回
    true
    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中显示的结果,它们似乎都表现得很好。

    我为您制作了一个jsben.ch…似乎indexOf快了一点。

    最快的

  • (ES6)包括
  • var string=“你好”, substring=“lo”; 字符串。包括(子字符串);
  • ES5及以上版本indexOf
  • var string=“你好”, substring=“lo”; string.indexOf(子字符串)!=-1.


    您是在询问固定子字符串,还是需要正则表达式(我对
    regex
    标记的使用感到有点困惑)?这篇文章会很有帮助。。将字符串拆分为一个围绕空格的数组,并进行数组交集如何?但这与其他方法相比又如何呢?这是最快的,还是只是众多方法中的一种?这应该是最快的,因为它是由JavaScript本身实现的(即,它运行本机代码)。任何其他基于JavaScript代码的方法都会比较慢。如果您知道确切的字符串,正则表达式可能会快一点(因为JavaScript引擎不必遍历原型链来查找.indexOf)。如果您需要不区分大小写的搜索,那么您肯定需要构建一个RegExp对象并调用
    test
    。只需在Safari中运行一个测试
    indexOf
    比任何其他方法都慢。所以实际上不能说哪种方法更快。它因浏览器而异。@Felix,这是一个很好的观察结果(在你亲自尝试之前,不要相信任何东西)!我记得有一句话,在有大量重复模式的字符串中,正则表达式应该比简单循环比较实现执行得更快,因为正则表达式被编译到状态机中,它可以比简单循环更快地回溯,而简单循环必须始终回溯到下一个字符+1.感谢你做了这个实验并把它拿出来!因为正则表达式是由JavaScript引擎在解析期间创建的,所以只有当要搜索的文本事先已知(即未存储在变量中)时,这可能会快一点。如果要在另一个字符串变量中搜索变量中包含的字符串,indexOf是最快的,因为您需要创建一个RegExp对象并处理该字符串以从经验中转义特殊字符等,如果您使用indexOf,则对于不区分大小写的搜索,indexOf可以更快。在您首先搜索的任何内容上使用小写。我正在编写一个Office 2013应用程序,使用Microsoft的Office Javascript API,并且使用
    indexOf
    不起作用。我不知道为什么。不过,使用正则表达式确实可以。这是一个边缘案例,但其他人可能会遇到相同的问题。有什么原因substr()不是可能的解决方案之一吗?我猜在很多情况下,它比正则表达式解决方案快得多。但我不知道它与indexOf()相比如何(因此,如果您忽略它,因为它的性能总是比indexOf()差,那么这很好,也许可以添加一个注释)。简短版本:indexOf()是所有方法中速度最快的,但这可能因字符串长度和任何重复模式而异。@Bison:如果您已经知道在哪里查找,则只能使用substr。我只关注一般解决方案。当有
    测试方法时,没有理由
    匹配
    检查最上面的答案。奇怪的是,手工制作的函数比内置函数好,但我想这是因为针只有一个字符。不过……在苹果iPad(iOS 7.1.1)上的Chrome Mobile 36.0.1985.57中进行了测试。IndexOf更快。Sorry@rpaxCharAt在所有平台上的速度都要快得多(基于
     str.includes('word')
    
    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)));
    
    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
    
    var ret = str.includes('one');
    
    var ret = (str.indexOf('one') !== -1);
    
    var string = "hello", substring = "lo"; string.includes(substring); var string = "hello", substring = "lo"; string.indexOf(substring) !== -1;