logo头像

总有人间一两风,填我十万八千梦

JS中判断字符串中是否含有一个子串

题目我就不过多解释了,这篇文章是对 stackoverflow 上一个问题的总结,如果英文不是特别差的话,推荐大家点击上面链接看大家对这个问题的详细讨论

实现方案

indexOf

1
2
3
var string = "foo",
substring = "oo";
string.indexOf(substring) !== -1;

String 的原型方法,返回一个字符串在另一个字符串中的位置,如果没有找到的话就返回 -1;也是大家经常用的方案

ES6 的 includes

1
2
3
var string = "foo",
substring = "oo";
string.includes(substring);

ES6 中新增的 String 原型方法(其实 Array 原型也有 includes 方法),可以点击这里查看文档

1
2
3
var string = "foo",
expr = /oo/;
string.search(expr);

String.prototype.search() 执行正则表达式和 String 对象之间的一个搜索匹配,所以参数需要是正则表达式,点击这里查看中文文档

lodash 的 includes

1
2
3
var string = "foo",
substring = "oo";
_.includes(string, substring);

lodash 是一个前端库,其提供了一些更加拥抱未来的方法,其中就有 _.includes(str,substr)

RegExp 和 test

1
2
3
var string = "foo",
expr = /oo/; // no quotes here
expr.test(string);

“正则表达式是万能的”,RegExp.prototype.test(str)

match

1
2
3
var string = "foo",
expr = /oo/;
string.match(expr);

和上面的 test 正好相反,match 方式是 String 的原型方法,String.prototype.match(expr)

性能比较

既然有这么多方法都可以实现,那么哪一种才是“性能最优”的方法呢?早就有前辈替我们做了测试,可以点击这里查看测试结果,或者直接看下面这张图片:

不出所料,果然原生方法 indexOf() 是最快的,所以我们以后就还尽量用 indexOf() 吧!

支付宝打赏 微信打赏

听说赞过就能年薪百万