我正在处理JavaScript的性能问题。所以我只想问:检查一个字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码片段?
您有以下三种可能性:
-
(new RegExp('word')).test(str) // or /word/.test(str)
-
str.indexOf('word') !== -1
-
str.includes('word')
正则表达式似乎更快(至少在Chrome 10中如此)。
** 2011年更新:**
不能肯定地说哪种方法更快。浏览器之间的差异是巨大的。虽然在Chrome 10中indexOf
似乎更快,但在Safari 5indexOf
中显然比任何其他方法都慢。
您必须看到并尝试自我。这取决于您的需求。例如,不区分大小写的搜索使用正则表达式会更快。
更新2018:
为了使人们免于自己运行测试,以下是大多数常见浏览器的当前结果,这些百分比表示性能比第二快的结果有所提高(在不同的浏览器中有所不同):
Chrome: indexOf(快〜98%)<-- wow
Firefox:缓存RegExp(快18%)
IE11:缓存RegExp(快10%)
Edge: indexOf(快18%)
Safari:缓存RegExp(快0.4%)
请注意,缓存的RegExp是:var r = new RegExp('simple'); var c = r.test(str);
相对于:/simple/.test(str)
The Fastest
- (ES6) includes
var string = "hello", substring = "lo"; string.includes(substring);
- ES5 and older indexOf
var string = "hello", substring = "lo"; string.indexOf(substring) !== -1;
Does this work for you?
string1.indexOf(string2) >= 0
Edit: This may not be faster than a RegExp if the string2 contains repeated patterns. On some browsers, indexOf may be much slower than RegExp. See comments.
编辑2:当字符串很长和/或包含重复模式时,RegExp可能比indexOf快。查看评论和@Felix的答案。
在ES6中,该includes()
方法用于确定是否可以在返回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之间
var ret = str.includes('one');
和
var ret = (str.indexOf('one') !== -1);
结果显示在jsperf中,它们似乎都表现良好。
我发现使用简单的for循环,遍历字符串中的所有元素,并使用charAt
进行比较比indexOf
或更快Regex
。该代码和证明可从JSPerf获得。
ETA:根据jsperf.com上列出的Browser Scope数据indexOf
,charAt
两者在Chrome Mobile上的执行效果都相似。
为了找到一个简单的字符串,使用indexOf()方法和使用正则表达式几乎是相同的:http : //jsperf.com/substring-因此,请选择看起来更容易编写的字符串。
这是使用.match()
method进行字符串转换的简单方法。
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)));
先生,祝你愉快!
我为您制作了一个jsben.ch http://jsben.ch/#/aWxtF ...似乎indexOf有点快。
文章标签:javascript , regex , substring
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!