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