最快的方式来检查一个string包含JavaScript中的另一个子string?
我正在处理JavaScript的性能问题。 所以我只想问:检查一个string是否包含另一个子string(我只需要布尔值)的最快方法是什么? 你能否build议你的想法和样片段代码?
你有两个可能性:
-
正则expression式 :
(new RegExp('word')).test(str) // or /word/.test(str)
-
indexOf
:str.indexOf('word') !== -1
正则expression式似乎更快 (至less在Chrome 10中)。
性能testing – 简短的草垛
性能testing – 漫长的干草堆
更新:
不能肯定地说哪种方法更快。 浏览器之间的差异是巨大的。 在Chrome 10中, indexOf
似乎更快,但在Safari 5中, indexOf
明显比任何其他方法都要慢。
你必须看到和尝试自我。 这取决于你的需求。 例如,对于正则expression式来说, 不区分大小写的search更快。
这对你有用吗?
string1.indexOf(string2) >= 0
编辑:如果string2包含重复模式,这可能不会比RegExp更快。 在某些浏览器上,indexOf可能比RegExp慢得多。 看评论。
编辑2:当string非常长和/或包含重复的模式时,RegExp可能比indexOf更快。 见评论和@ Felix的答案。
我发现使用一个简单的for循环,遍历string中的所有元素,并使用charAt
执行比indexOf
或Regex
更快。 代码和certificate可在JSPerf上find 。
ETA: indexOf
和charAt
在Chrome Mobile上的performance都差不多,根据jsperf.com上列出的Browser Scope数据
为了find一个简单的string,使用indexOf()方法和使用正则expression式几乎是相同的: http : //jsperf.com/substring – 所以select哪一个似乎更容易编写。
在ES6中, includes()
方法用于确定在另一个string中是否可以find一个string,并根据需要返回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所显示的结果,似乎他们都performance良好。
我为你做了一个jsben.ch http://jsben.ch/#/aWxtF …似乎indexOf有点快。
使用.match()
方法进行string的简单方法。
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)));
先生,祝你有美好的一天!