讲includes(),indexOf()

**## 讲includes(),indexOf()

简单的跟大家分享一些我对于includes(),indexOf()的了解。

我也是偶然的情况下发现了includes(),以前我只知道indeOf()。遇到了也就顺便了解一点。

两者工作性质都是查找数据是否存在该元素;要不然我也不会知道includes()。但是两者还是有一些区别的,我们先创建一个全局数组:

var arr = ['k','a','a','a',NaN,['e','f'],'b','c']

我们先简单的查找一个字符:

console.log(arr.includes('a')) //true
console.log(arr.includes('aa')) //false
console.log(arr.indexOf('a')) //1 
console.log(arr.indexOf('aa')) //-1 

(1)includes():若存在返回true 若不存在返回false,很直接的告诉你是否存在;

(2)indeOf():若存在返回下标 ,若不存在返回-1,不仅告诉该元素是否存在还顺带告诉你该元素下标,可以说indeOf()更倾向于满足开发人员需求吧(不准确,我只是没有词语形容)。

(3)includes()可以传两个参数code:要查找的元素和num:出现过几次(参数名自定义,我是为了方便讲解)大家回看下上面的数组

console.log(arr.includes('a',3)) 

字符a在数组中出现过3次,那么我第二参数可以写1,2或者3都会返回true,写其它都是返回false。第二参数我是没有实战运用过感觉比较鸡肋。
(4)两者都是只对简单数据类型的查找

 console.log(arr.includes(['e','f'])) //false
 console.log(arr.indexOf(['e','f'])) //-1

(5)两者都是采用=== 的操作符号进行比较的,不同之处在于对NaN的处理结果。js中NaN===NaN 返回时false,故而言之indexOf(NaN)是返回-1的;但是includes()不是这样的,它是可以查询到NaN的。

 console.log(arr.includes(NaN)) //true
 console.log(arr.indexOf(NaN)) //-1

本人公众号,平时也会分享一些前端知识,感兴趣的同学可以了解一下
在这里插入图片描述

<think>嗯,用户想知道怎么用编程方法检查一个字符串是否包含特定的子串。比如例子里的'AI and big data are very important!'包含'big data'。首先,我得回忆一下不同的编程语言中常用的方法。比如在Python里,可能用in关键字或者find方法。Java的话,可能用contains方法,或者indexOfJavaScript也有includes或者indexOf之类的。不过用户可能主要关注某一种语言,但问题里没有特别说明,所以可能需要给出几种常见语言的示例。 然后,我需要确保回答的结构清晰,按照用户的要求分步骤解释,比如先思路,再给不同语言的实现。还要注意引用站内的资料。比如,引用[1]提到哈希表,可能和某些算法有关联吗?比如KMP算法或者Rabin-Karp算法,这些可能用哈希来加速子串查找。不过用户的问题可能只需要基础的方法,但或许可以提到更高效的算法作为扩展。 另外,用户提供的示例中,引用了关于移动构造函数和线程支持库的内容,但这些可能和当前问题关系不大。不过引用[4]中的模式匹配例子可能相关,比如在流数据中查找特定模式,类似子串匹配的问题。可能可以提到更复杂的算法,比如KMP或者Boyer-Moore,这些适用于大规模文本或流处理的情况。 用户的问题可能还希望了解不同方法的时间复杂度,比如暴力法的时间是O(n*m),而KMP是O(n+m),这样在性能敏感的场景下可以选择更优的方法。不过对于大多数日常应用,内置的字符串方法已经足够,比如Python的in操作符底层可能已经优化过了。 另外,用户提供的示例中提到了哈希表的实现,可能在某些情况下,比如统计字符出现次数,但子串匹配可能需要更复杂的数据结构,比如前缀树或者自动机。不过这可能超出用户当前的需求范围,但可以作为扩展内容提到。 总结下来,回答应该包括以下几点: 1. 不同编程语言的内置方法(Python、Java、JavaScript等) 2. 基础实现示例,比如暴力匹配 3. 高效算法简介,如KMP或Rabin-Karp 4. 时间复杂度的比较 5. 应用场景建议,比如何时用内置方法,何时需要更优算法 同时,要注意引用相关的站内内容,比如引用[1]的哈希表可能和Rabin-Karp算法有关,使用滚动哈希来优化匹配。引用[4]的模式匹配示例可以联系到更复杂的应用场景,比如流式数据中的实时匹配。 在编写代码示例时,要确保语法正确,比如Python中的in用法,Java的contains方法,以及JavaScriptincludes。同时,对于暴力匹配,可能需要写出双重循环,比较每个字符是否匹配。 此外,用户可能希望了解如何返回子串的位置,而不仅仅是布尔值,所以可以提到find/indexOf等方法返回索引。 最后,生成的相关问题可能需要包括不同算法的比较、如何实现高效匹配,或者特定语言中的最佳实践等。</think>### 检查字符串是否包含特定子串的方法 #### 一、基本实现思路 通过遍历主字符串,逐字符与子串进行匹配。若找到连续匹配的子序列则返回真,时间复杂度为$O(n \cdot m)$(n为主串长度,m为子串长度)。现代编程语言通常已内置优化方法,如KMP算法或Boyer-Moore算法[^4]。 #### 二、具体编程实现 1. **Python实现** ```python s = 'AI and big data are very important!' sub = 'big data' print(sub in s) # 输出True # 获取位置 print(s.find(sub)) # 输出8 ``` 2. **Java实现** ```java String s = "AI and big data are very important!"; String sub = "big data"; System.out.println(s.contains(sub)); // 输出true // 获取位置 System.out.println(s.indexOf(sub)); // 输出8 ``` 3. **JavaScript实现** ```javascript let s = 'AI and big data are very important!'; let sub = 'big data'; console.log(s.includes(sub)); // 输出true // 获取位置 console.log(s.indexOf(sub)); // 输出8 ``` #### 三、暴力匹配算法示例 ```python def contains_substring(s, sub): n, m = len(s), len(sub) for i in range(n - m + 1): if s[i:i+m] == sub: return True, i return False, -1 ``` #### 四、优化算法对比 | 算法 | 时间复杂度 | 适用场景 | |------|-----------|----------| | 暴力匹配 | $O(n \cdot m)$ | 短文本匹配 | | KMP | $O(n + m)$ | 模式串含重复特征 | | Rabin-Karp | $O(n + m)$ | 多模式匹配[^1] | | Boyer-Moore | $O(n/m)$ | 大规模文本搜索 | #### 五、应用建议 - 日常开发直接使用内置方法(如`in``contains`) - 处理GB级文本时建议使用优化算法 - 流式数据匹配可参考滑动窗口机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值