我正在处理 JavaScript 的性能问题。所以我只想问:检查一个字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?你能提出你的想法和示例代码片段吗?
在 JavaScript 中检查字符串是否包含另一个子字符串的最快方法?
你有三种可能:
-
(new RegExp('word')).test(str) // or /word/.test(str)
-
str.indexOf('word') !== -1
-
str.includes('word')
正则表达式似乎更快(至少在 Chrome 10 中)。
**2011 年更新:**
不能肯定地说哪种方法更快。浏览器之间的差异是巨大的。虽然在 Chrome 10 中indexOf
似乎更快,但在 Safari 5 中,indexOf
显然比任何其他方法都慢。
你必须看到并尝试自己。这取决于您的需求。例如,不区分大小写的搜索使用正则表达式会更快。
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)
最快的
- (ES6)包括
var string = "你好", 子串 = "lo"; 字符串。包含(子字符串);
- ES5 及更早的indexOf
var string = "你好", 子串 = "lo"; string.indexOf(substring) !== -1;
这对你有用吗?
string1.indexOf(string2) >= 0
编辑:如果 string2 包含重复模式,这可能不会比 RegExp 快。在某些浏览器上,indexOf 可能比 RegExp 慢得多。看评论。
编辑 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 循环,遍历字符串中的所有元素并比较 using 的charAt
执行速度比indexOf
or快Regex
。代码和证明可在JSPerf 获得。
ETA:根据 jsperf.com 上列出的浏览器范围数据indexOf
,charAt
两者在 Chrome Mobile 上的表现都同样糟糕