JavaScript的:对的indexOf搜索匹配的字符串时?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript的:对的indexOf搜索匹配的字符串时?相关的知识,希望对你有一定的参考价值。
抛开可读性,是否有使用之间的任何可辨别的差异(性能也许)
str.indexOf("src")
和
str.match(/src/)
我个人比较喜欢match
(和正则表达式),但同事们似乎走另一条路。我们想知道,如果它要紧......?
编辑:
我应该在一开始就认为这是对函数会做部分纯字符串匹配(拿起在jQuery的类属性标识符),而不是用通配符等全面的正则表达式搜索说
class='redBorder DisablesGuiClass-2345-2d73-83hf-8293'
因此,它的区别:
string.indexOf('DisablesGuiClass-');
VS
string.match(/DisablesGuiClass-/)
正则表达式确实比慢的indexOf(你可以看到它here),尽管通常这不应该是一个问题。随着正则表达式,你还必须确保字符串被正确地转义,这是考虑额外的事情。
这两个问题不谈,如果两个工具做什么,你需要他们,为什么不选择更简单的吗?
记得Internet Explorer 8的不理解qazxsw POI。但是,如果你的用户没有人使用IE8(谷歌分析会告诉你),比忽略这个答案。可能的解决方案来解决IE8:qazxsw POI
您比较可能并不完全公平。 indexOf
使用具有纯字符串,因此非常快; match
需要一个正则表达式 - 当然它可能比较慢,但是如果你想要做一个正则表达式匹配,你不会indexOf
跑远。在另一方面,正则表达式引擎可以进行优化,并在过去几年的表现一直在改善。
在你的情况下,如果你正在寻找一个逐字字符串,indexOf
应该足够了。还有的正则表达式的一个应用程序,但如果你需要匹配整个单词,并希望避免匹配子,那么正则表达式给你“字边界锚”。例如:
indexOf('bar')
会发现bar
在bar, fubar, barmy
三次,而
match(/\bbar\b/)
当它不是一个较长的单词的一部分将只匹配bar
。
正如你可以在注释中看到,一些比较已经做到这一点表明,正则表达式可能比indexOf
快 - 如果它的性能关键,你可能需要分析代码。
如果你想搜索的字符串出现不区分大小写然后match
似乎比indexOf
和toLowerCase()
的组合更快
请在这里 - http://jsperf.com/regexp-vs-indexof/152
你问是否str.indexOf('target')
或str.match(/target/)
应该是首选。正如其他海报建议,这些方法的使用情况和返回类型是不同的。第一问:“在str
我在哪里可以先找到'target'
?”第二问:“确实str
匹配正则表达式,如果是这样,什么是所有的比赛对任何相关捕获组?”
问题是,没有一个技术上的设计要求简单的问题:“请问字符串包含子?”也有一些是被明确设计可以这样做:
var doesStringContainTarget = /target/.test(str);
有几个优点,使用regex.test(string)
:
- 它返回一个布尔值,它是你关心什么
- 它比
str.match(/target/)
更好的性能(和竞争对手str.indexOf('target')
) - 如果由于某种原因,
str
是undefined
或null
,你会得到false
(期望的结果),而不是抛出一个TypeError
使用indexOf
应,在理论上,比当你只是在寻找一些纯文本的正则表达式快,但你应该自己做一些比较基准,如果你关心性能。
如果你喜欢match
,它的速度不够快你的需求,然后去了。
对于它的价值,我对这个同事同意:我会为一个普通的搜索字符串时使用indexOf
,并使用match
等,只有当我需要通过正则表达式提供的额外功能。
性能方面indexOf
将起码比match
稍快。这一切都归结到具体实施。在决定使用哪种问自己以下问题:
将整数索引足够或者我需要一个正则表达式匹配结果的功能?
返回值是不同的
除了对性能的影响,这是由其他的答案解决,需要注意的是每个方法的返回值不同是很重要的;这样的方法可不仅在不也改变你的逻辑取代。
.indexOf
的返回值:integer
指定的值的第一个发生的呼叫
String
对象中的索引,开始于fromIndex
搜索。 返回-1
如果值是找不到的。
.match
的返回值:array
包含整个匹配结果和任何括号捕获的阵列匹配的结果。 返回
null
如果没有匹配。
由于.indexOf
返回0
如果调用字符串指定的值开始,一个简单的truthy测试将失败。
例如:
鉴于这种类...
class='DisablesGuiClass-2345-2d73-83hf-8293 redBorder'
......每一个返回值将有所不同:
// returns `0`, evaluates to `false`
if (string.indexOf('DisablesGuiClass-'))
… // this block is skipped.
与
// returns `["DisablesGuiClass-"]`, evaluates to `true`
if (string.match(/DisablesGuiClass-/))
… // this block is run.
运行与.indexOf
返回一个truthy测试的正确方法是要测试的-1
:
if (string.indexOf('DisablesGuiClass-') !== -1)
// ^returns `0` ^evaluates to `true`
… // this block is run.
这里所有可能的方式(相对)搜索字符串
// 1.包括(在ES6引入)
var string = "string to search for substring",
substring = "sea";
string.includes(substring);
// 2. string.indexOf
var string = "string to search for substring",
substring = "sea";
string.indexOf(substring) !== -1;
// 3,正则表达式:测试
var string = "string to search for substring",
expr = /sea/; // no quotes here
expr.test(string);
// 4. string.match
var string = "string to search for substring",
expr = "/sea/";
string.match(expr);
//5. string.search
var string = "string to search for substring",
expr = "/sea/";
string.search(expr);
基准似乎是专门为扭器ES6包括阅读注释。
In resume:
如果你不需要匹配。 =>要么你需要的正则表达式,因此使用测试。否则ES6包括或的indexOf。不过测试VS的indexOf接近。
而对于包括VS的indexOf:
他们似乎是相同的:https://jsperf.com/array-indexof-vs-includes/4(如果它是不同的,将是奇怪的,他们大多是执行相同的,除了它们公开check this的差异)
而对于我自己的基准测试。这里是http://jsben.ch/fFnA0您可以测试工作(这是依赖于浏览器)测试多个时间]在这里表现如何(多个运行的indexOf并包括一个击败其他,和他们接近)。因此,他们是相同的。 [在此使用相同的测试平台作为物品上述]。
而这里的长文本版本(的8倍)http://jsben.ch/wSBA2
测试了Chrome和Firefox,同样的事情。
通知jsben.ch不处理内存溢出(或正确有没有限制,它不显示任何信息),这样的结果,如果你添加更多的则8文本复制(8个工作井)可能出错的地方。但得出的结论是非常大的文本全部三个执行相同的方式。否则,对于短的indexOf,包括是相同的测试稍微慢一点。或者可以是,因为它似乎在铬相同(火狐60是慢)。
与jsben.ch注意:如果你得到不一致的结果,也不要惊慌。尝试不同时间,看看它是否一致与否。更改浏览器,有时他们只是运行完全错误的。错误或处理不好的记忆。或者其他的东西。
例如:
在这里我也对jsperf基准(更出众的细节,并处理多个浏览器图)
(顶部是铬)
普通文本qazxsw POI 简历:包括和的indexOf具有相同的性能。测试速度较慢。
qazxsw POI qazxsw POI(似乎所有的三个镀铬中执行相同)
长文本(12个时长,则正常)https://jsperf.com/indexof-vs-includes-vs-test-2019 恢复:所有三个相同的性能。 (铬和Firefox)
很短的字符串 恢复:包括和的indexOf执行相同和测试慢。
以上是关于JavaScript的:对的indexOf搜索匹配的字符串时?的主要内容,如果未能解决你的问题,请参考以下文章