我正在处理JavaScript的性能问题。所以我只想问:检查一个字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码片段?
我正在处理JavaScript的性能问题。所以我只想问:检查一个字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码片段?
Answers:
您有两个可能性:
正则表达式似乎更快(至少在Chrome 10中如此)。
不能肯定地说哪种方法更快。浏览器之间的差异是巨大的。虽然在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)
indexOf
但无法使用。我不知道为什么。虽然使用Regex。这是一个极端的情况,但是其他人可能会遇到相同的问题。
这对您有用吗?
string1.indexOf(string2) >= 0
编辑:如果string2包含重复的模式,这可能不会比RegExp快。在某些浏览器上,indexOf可能比RegExp慢得多。看评论。
编辑2:当字符串很长和/或包含重复模式时,RegExp可能比indexOf快。查看评论和@Felix的答案。
test
。
indexOf
比其他方法慢一个数量级。因此,实际上不能说哪种方法更快。随浏览器的不同而不同。
最快的
var string =“ hello”, substring =“ lo”; string.includes(substring);
var string =“ hello”, substring =“ lo”; string.indexOf(substring)!== -1;
在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中,它们似乎都表现良好。
str.includes("x|y")
; 在同一调用中搜索文字“ x”或“ y”。
regex
在其中使用。一种解决您的问题的方法,str.includes("x") || str.includes('y')
indexOf
因此速度大大快于includes
(提高了1600%)。目前尚不清楚4400万次迭代/秒和777+百万个 i /秒之间的差异如何影响现实世界的性能,但是移动设备可能会受益匪浅,这indexOf
应该是理想的选择。
我发现使用简单的for循环,遍历字符串中的所有元素并使用charAt
进行比较的效果比indexOf
或快Regex
。该代码和证明可从JSPerf获得。
ETA:根据jsperf.com上列出的Browser Scope数据indexOf
,charAt
两者在Chrome Mobile上的执行效果都类似
为了找到一个简单的字符串,使用indexOf()方法和使用正则表达式几乎是相同的:http : //jsperf.com/substring-因此,请选择哪一个看起来更容易编写。
我为您制作了一个jsben.ch http://jsben.ch/#/aWxtF ...似乎indexOf更快。
这是使用.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)));
先生,祝您有个美好的一天!
match
什么时候有test
方法...请查看最佳答案。
regex
标记让我有些困惑)?