我正在处理JavaScript的性能问题。所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您可以建议您的想法和示例代码片段吗?


当前回答

2022弦研究基准

从Felix Kling的回答,以及我对给定链接所做的测试。

最常用的浏览器:

铬(64%) Safari (19%) New Edge (4%) Firefox (3.26%) 三星(2.86%) 歌剧(2.12%)

Chrome和NE都基于Chromium =>相同的性能。

Ci =不区分大小写 / =与left相同

测试结果

string length Firefox Safari Chromium
short cached RegExp ci cached RegExp ci indexOf & / ci worth
RegExp & / ci RegExp ci RegExp & / ci worse
long cached RegExp cached RE & / ci & reg ci indexOf worth
indexOf ci indexOf ci RegExp worse

操作/秒的比较

browser Firefox Safari Chromium
cached RegExp 1.3M 425k 1.2M
diff 1.08x >
cached RegExp case sensitive 28M 31M 42M
diff 1.44/1.35x >
indexOf 27M 25M 1.9B
diff 70/76x >
indexOf case sensitive 13.8M 18.5M 1.9B
diff 137/103x >

Firefox最佳方法:缓存regexp不区分大小写 Chrome最佳方法:indexOf / indexOf不区分大小写 Safari最佳方法:缓存RegExp不区分大小写

Chrome的性能比其他两款浏览器好得多。

最佳妥协:indexOf: String.indexOf(substring) > -1。

注意:如果你想使用indexOf区分大小写的方式,如果你操作String.toLowerCase(),它会添加一些操作,所以它非常类似于不敏感的方式。在这种情况下,您应该在搜索过程之前降低子字符串,而不是在其中降低子字符串。

regex非常适合复杂的和/或模式的研究/替换,但不适用于所有语言的全局研究,因为它的本质。

其他回答

我发现使用一个简单的for循环,遍历字符串中的所有元素并使用charAt进行比较比indexOf或Regex执行得更快。代码和证明可以在JSPerf中找到。

根据jsperf.com上列出的浏览器范围数据,indexOf和charAt在Chrome Mobile上的表现同样糟糕

这是使用.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)));

祝您有愉快的一天,先生!

在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 between

var ret = str.includes('one');

And

var ret = (str.indexOf('one') !== -1);

正如在jsperf中显示的结果,它们似乎都表现得很好。

为了找到一个简单的字符串,使用indexOf()方法和使用regex方法几乎是一样的:http://jsperf.com/substring -所以选择哪个看起来更容易编写。

最快的

(ES6) includes

    var string = "hello",
    substring = "lo";
    string.includes(substring);

智慧指数

    var string = "hello",
    substring = "lo";
    string.indexOf(substring) !== -1;

http://jsben.ch/9cwLJ