在字符串中搜索子字符串,是最基本的操作之一,我们经常会遇到,我通常做的是,查看代码中的其他地方,看看其他人都做了什么,然后做同样的事情! 现在,我只是想提出一些最常用的选项,以及它们之间的性能比较,以防您关心性能,以便当涉及到将来的选择时,您知道哪一个是更好的选择!
代码展示
下面是我在搜索字符串时经常看到的 6 种不同的方法:
// 1. includes (introduced in ES6)
var string = "string to search for substring",
substring = "sea";
string.includes(substring);
// 2. RegExp: test
var string = "string to search for substring",
expr = /sea/; // no quotes here
expr.test(string);
//3. string.search
var string = "string to search for substring",
expr = "/sea/";
string.search(expr);
//4. lodash: includes
var string = "string to search for substring",
substring = "sea";
_.includes(string, substring);
// 5. string.match
var string = "string to search for substring",
expr = "/sea/";
string.match(expr);
// 3. string.indexOf
var string = "string to search for substring",
substring = "sea";
string.indexOf(substring) !== -1;
性能基准测试
- 如果你想知道,给出一个一般长度的字符串,哪个会表现得更好,regex.test是最快的,其次是 string.search(libraries by ES6),第三位属于string.indexof 方法:
前往测试页面 →
- 如果放大测试字符串的规模会怎么样?
我缩放这个字符串,把它放大 1000 倍 (100 万字符,甚至 1000 万字符),我看到string.indexof 是一个赢家,虽然不是很多!
下面这是我的基准测试的结果,我创建了 1~1000 万个字符的字符串来进行测试
基准测试非常大的字符串,并重复子字符串 1000 次:
前往测试页面 →
译者注:这个链接提供的测试内容感觉跟作者描述的测试内容不符,可能链接是错的