JavaScript中包含子串判定的几种方法及效率对比分析
2018-02-23 本文已影响8人
毛三十
说明
在JavaScript中并没有一个类似于contains的原生函数,用来判定是否包含子串。但是有如下几种方法可以实现该功能:
方法1:利用String.prototype.indexOf(),该函数 返回子串在主字符串中的位置。如果主字符串中不包含子串,返回-1。
function contain1(string,sub) {
return string.indexOf(sub) !== -1;
}
方法2:利用String.prototype.includes()。该方法在ECMAScript 2015规范中出现,目前还没有在所有的浏览器上实现。
function contain2(string,sub) {
return string.includes(sub);
}
方法3:利用String.prototype.search(),该函数返回模式匹配的位置,如不匹配返回-1。
function contain3(string,sub) {
return string.search(new RegExp(sub)) > -1;
}
方法4:利用RegExp.prototype.test(),该函数用来判定模式是否匹配,直接返回布尔值。
function contain4(string,sub) {
return new RegExp(sub).test(string);
}
方法5:利用String.prototype.match(),该方法可在字符串内检索指定的值,返回存放匹配结果的数组,如不匹配返回null。
function contain5(string,sub) {
return !!string.match(new RegExp(sub));
}
效率对比实验
- 随机构建50000个长度为100的主字符串数组和长度为2的子串做为实验数据。
- 分别利用上述五种方法分别对数据进行对比测试。
- 利用Baidu的Echarts和时间数据绘制效率对比图。
结论
为保证网页的运行效率,选择的实验样本很小,得出的时间结果有一定的偶然性。但综合对比和进行更大样本的实验显示,利用String.prototype.indexOf()方法的效率最好,稳定性强。
includes函数
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
'use strict';
if (typeof start !== 'number') {
start = 0;
}
if (start + search.length > this.length) {
return false;
} else {
return this.indexOf(search, start) !== -1;
}
};
}
最后记得把includes函数加入到您的函数库吧!