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')

会发现barbar, fubar, barmy三次,而

match(/\bbar\b/)

当它不是一个较长的单词的一部分将只匹配bar

正如你可以在注释中看到,一些比较已经做到这一点表明,正则表达式可能比indexOf快 - 如果它的性能关键,你可能需要分析代码。

另一答案

如果你想搜索的字符串出现不区分大小写然后match似乎比indexOftoLowerCase()的组合更快

请在这里 - http://jsperf.com/regexp-vs-indexof/152

另一答案

你问是否str.indexOf('target')str.match(/target/)应该是首选。正如其他海报建议,这些方法的使用情况和返回类型是不同的。第一问:“在str我在哪里可以先找到'target'?”第二问:“确实str匹配正则表达式,如果是这样,什么是所有的比赛对任何相关捕获组?”

问题是,没有一个技术上的设计要求简单的问题:“请问字符串包含子?”也有一些是被明确设计可以这样做:

var doesStringContainTarget = /target/.test(str);

有几个优点,使用regex.test(string)

  1. 它返回一个布尔值,它是你关心什么
  2. 它比str.match(/target/)更好的性能(和竞争对手str.indexOf('target')
  3. 如果由于某种原因,strundefinednull,你会得到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);

这里一个src:https://koukia.ca/top-6-ways-to-search-for-a-string-in-javascript-and-performance-benchmarks-ce3e9b81ad31

基准似乎是专门为扭器ES6包括阅读注释。

In resume:

如果你不需要匹配。 =>要么你需要的正则表达式,因此使用测试。否则ES6包括或的indexOf。不过测试VS的indexOf接近。

而对于包括VS的indexOf:

他们似乎是相同的:https://jsperf.com/array-indexof-vs-includes/4(如果它是不同的,将是奇怪的,他们大多是执行相同的,除了它们公开check this的差异)

而对于我自己的基准测试。这里是http://jsben.ch/fFnA0您可以测试工作(这是依赖于浏览器)测试多个时间]在这里表现如何(多个运行的indexOf并包括一个击败其他,和他们接近)。因此,他们是相同的。 [在此使用相同的测试平台作为物品上述]。

enter image description here enter image description here

而这里的长文本版本(的8倍)http://jsben.ch/wSBA2

enter image description here

测试了Chrome和Firefox,同样的事情。

通知jsben.ch不处理内存溢出(或正确有没有限制,它不显示任何信息),这样的结果,如果你添加更多的则8文本复制(8个工作井)可能出错的地方。但得出的结论是非常大的文本全部三个执行相同的方式。否则,对于短的indexOf,包括是相同的测试稍微慢一点。或者可以是,因为它似乎在铬相同(火狐60是慢)。

与jsben.ch注意:如果你得到不一致的结果,也不要惊慌。尝试不同时间,看看它是否一致与否。更改浏览器,有时他们只是运行完全错误的。错误或处理不好的记忆。或者其他的东西。

例如:

enter image description here

在这里我也对jsperf基准(更出众的细节,并处理多个浏览器图)

(顶部是铬)

普通文本qazxsw POI 简历:包括和的indexOf具有相同的性能。测试速度较慢。

qazxsw POI qazxsw POI(似乎所有的三个镀铬中执行相同)

长文本(12个时长,则正常)https://jsperf.com/indexof-vs-includes-vs-test-2019 恢复:所有三个相同的性能。 (铬和Firefox)enter image description here

很短的字符串enter image description here 恢复:包括和的indexOf执行相同和测试慢。

以上是关于JavaScript的:对的indexOf搜索匹配的字符串时?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中是不是有indexOf来搜索具有自定义比较功能的数组

javascript常用函数

你不知道的javaScript 之indexOf()

正则匹配模式汇总

javascriptphp关键字搜索函数

在Javascript中查找不包含/ indexOf / Regex的字符串中的子字符串