我正在处理JavaScript的性能问题。所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您可以建议您的想法和示例代码片段吗?
当前回答
这对你有用吗?
string1.indexOf(string2) >= 0
编辑:如果string2包含重复的模式,这可能不会比RegExp更快。在某些浏览器上,indexOf可能比RegExp慢得多。看到评论。
编辑2:当字符串非常长和/或包含重复的模式时,RegExp可能比indexOf更快。请看评论和@Felix的回答。
其他回答
这对你有用吗?
string1.indexOf(string2) >= 0
编辑:如果string2包含重复的模式,这可能不会比RegExp更快。在某些浏览器上,indexOf可能比RegExp慢得多。看到评论。
编辑2:当字符串非常长和/或包含重复的模式时,RegExp可能比indexOf更快。请看评论和@Felix的回答。
我做了一个jsben。ch为你http://jsben.ch/#/aWxtF…似乎indexOf有点快。
我发现使用一个简单的for循环,遍历字符串中的所有元素并使用charAt进行比较比indexOf或Regex执行得更快。代码和证明可以在JSPerf中找到。
根据jsperf.com上列出的浏览器范围数据,indexOf和charAt在Chrome Mobile上的表现同样糟糕
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非常适合复杂的和/或模式的研究/替换,但不适用于所有语言的全局研究,因为它的本质。
在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中显示的结果,它们似乎都表现得很好。
推荐文章
- jQuery等价于JavaScript的addEventListener方法
- jQuery需要避免的陷阱
- JavaScript中变量字符串的XML解析
- 'React'指的是一个UMD全局,但当前文件是一个模块
- 为什么useState不触发重新渲染?
- 如何使用回调与useState挂钩在反应
- 网络请求失败
- 如何使用JavaScript大写字符串中每个单词的第一个字母?
- 如何使用箭头函数(公共类字段)作为类方法?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- Angular JS:当我们已经有了具有作用域的指令控制器时,指令的link函数还需要什么?
- 我如何在JavaScript中转换对象数组为一个对象?
- 如何让一个按钮将我的页面重定向到另一个页面?
- 如何让元素被点击(对于整个文档)?