我正在处理JavaScript上的性能问题。所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码段?
答案 0 :(得分:289)
你有两个可能性:
(new RegExp('word')).test(str)
// or
/word/.test(str)
str.indexOf('word') !== -1
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
进行比较的速度比indexOf
或Regex
快。代码和证明可在JSPerf获得。
根据jsperf.com上列出的浏览器范围数据,ETA:indexOf
和charAt
在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)
最快
var string = "hello", substring = "lo"; string.includes(substring);
var string = "hello", substring = "lo"; string.indexOf(substring) !== -1;
答案 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)));
希望你过得愉快,先生!