介绍 此篇属于前端算法入门系列的第一篇,主要介绍常用的数组方法、字符串方法、遍历方法、高阶函数、正则表达式以及相关数学知识。前端算法入门一:刷算法题常用的JS基础扫盲〔1〕前端算法入门二:时间空间复杂度8大数据结构的JS实现〔2〕前端算法入门三:5大排序算法2大搜索4大算法思想〔3〕前端面试算法高频100题(附答案,分析思路,一题多解)〔4〕文章主要包含以下内容: 数组常用方法 字符串常用方法 常用遍历方法高阶函数 常用正则表达式 数学知识一、数组常用方法1。push() 在尾部追加,类似于压栈,原数组会变。constarr〔1,2,3〕arr。push(8)console。log(arr)〔1,2,3,8〕复制代码2。pop() 在尾部弹出,类似于出栈,原数组会变。数组的pushpop可以模拟常见数据结构之一:栈。constarr〔1,2,3〕constpopValarr。pop()console。log(popVal)3console。log(arr)〔1,2〕数组模拟常见数据结构之一:栈conststack〔0,1〕stack。push(2)压栈console。log(stack)〔0,1,2〕constpopValuestack。pop()出栈console。log(popValue)2console。log(stack)〔0,1〕复制代码3。unshift() 在头部压入数据,类似于入队,原数组会变。constarr〔1,2,3〕arr。unshift(0)console。log(arr)〔0,1,2,3〕复制代码4。shift() 在头部弹出数据,原数组会变。数组的push(入队)shift(出队)可以模拟常见数据结构之一:队列。constarr〔1,2,3〕constshiftValarr。shift()console。log(shiftVal)1console。log(arr)〔2,3〕数组模拟常见数据结构之一:队列constqueue〔0,1〕queue。push(2)入队console。log(queue)〔0,1,2〕constshiftValuequeue。shift()出队console。log(shiftValue)0console。log(queue)〔1,2〕复制代码5。concat() concat会在当前数组尾部拼接传入的数组,然后返回一个新数组,原数组不变。constarr〔1,2,3〕constarr2arr。concat(〔7,8,9〕)console。log(arr)〔1,2,3〕console。log(arr2)〔1,2,3,7,8,9〕复制代码6。indexOf() 在数组中寻找该值,找到则返回其下标,找不到则返回1。constarr〔1,2,3〕console。log(arr。indexOf(2))1console。log(arr。indexOf(0))1复制代码7。includes() 在数组中寻找该值,找到则返回true,找不到则返回false。constarr〔1,2,3〕console。log(arr。includes(2))trueconsole。log(arr。includes(4))false复制代码8。join() 将数组转化成字符串,并返回该字符串,不传值则默认逗号隔开,原数组不变。constarr〔1,2,3〕console。log(arr。join())‘1,2,3’console。log(arr)〔1,2,3〕复制代码9。reverse() 翻转原数组,并返回已完成翻转的数组,原数组改变。constarr〔1,2,3〕console。log(arr。reverse())〔3,2,1〕console。log(arr)〔3,2,1〕复制代码10。slice(start,end) 从start开始截取到end,但是不包括endconstarr〔1,2,3,4,5〕console。log(arr。slice(1,4))〔2,3,4〕console。log(arr)〔1,2,3,4,5〕复制代码11。splice(start,deleteCount,item1,item2)start参数开始的位置deleteCount要截取的个数后面的items为要添加的元素如果deleteCount为0,则表示不删除元素,从start位置开始添加后面的几个元素到原始的数组里面。返回值为由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。这个方法会改变原始数组,数组的长度会发生变化constarr3〔1,2,3,4,5,6,7,f1,f2〕;constarr4arr3。splice(2,3)删除第三个元素以后的三个数组元素(包含第三个元素)console。log(arr4);〔3,4,5〕;console。log(arr3);〔1,2,6,7,f1,f2〕;原始数组被改变constarr5arr3。splice(2,0,wu,leon);从第2位开始删除0个元素,插入wu,leonconsole。log(arr5);〔〕返回空数组console。log(arr3);〔1,2,wu,leon,6,7,f1,f2〕;原始数组被改变constarr6arr3。splice(2,3,xiao,long);从第2位开始删除3个元素,插入xiao,longconsole。log(arr6);〔wu,leon,6〕console。log(arr3);〔1,2,xiao,long,7,f1,f2〕constarr7arr3。splice(2);从第三个元素开始删除所有的元素console。log(arr7);〔xiao,long,7,f1,f2〕console。log(arr3);〔1,2〕复制代码12。sort()对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF16代码单元值序列时构建的。由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。 可参考MDN:Sort〔5〕constarr〔1,2,3〕arr。sort((a,b)ba)console。log(arr)〔3,2,1〕复制代码13。toString() 将数组转化成字符串,并返回该字符串,逗号隔开,原数组不变。constarr〔1,2,3,4,5〕console。log(arr。toString())‘1,2,3,4,5’console。log(arr)〔1,2,3,4,5〕复制代码二、字符串常用方法1。charAt() 返回指定索引位置处的字符。类似于数组用中括号获取相应下标位置的数据。varstrabcdefgconsole。log(str。charAt(2))输出cconsole。log(str〔2〕)输出c复制代码2。concat() 类似数组的concat(),用来返回一个合并拼接两个或两个以上字符串。原字符串不变。conststr1abcdefgconststr21234567conststr3str1。concat(str2)console。log(str3)输出abcdefg1234567复制代码3。indexOf()、lastIndexOf() indexOf,返回一个字符在字符串中首次出现的位置,lastIndexOf返回一个字符在字符串中最后一次出现的位置。conststrabcdcefcgconsole。log(str。indexOf(c))输出2console。log(str。lastIndexOf(c))输出7复制代码4。slice() 提取字符串的片断,并把提取的字符串作为新的字符串返回出来。原字符串不变。conststrabcdefgconsole。log(str。slice())输出abcdefg,不传递参数默认复制整个字符串console。log(str。slice(1))输出bcdefg,传递一个,则为提取的起点,然后到字符串结尾console。log(str。slice(2,str。length1))输出cdef,传递两个,为提取的起始点和结束点复制代码5。split() 使用指定的分隔符将一个字符串拆分为多个子字符串数组并返回,原字符串不变。conststrABCDEFGconsole。log(str。split())输出〔A,B,C,D,E,F,G〕复制代码6。substr(),substring()这两个方法的功能都是截取一个字符串的片段,并返回截取的字符串。substr和substring这两个方法不同的地方就在于参数二,substr的参数二是截取返回出来的这个字符串指定的长度,substring的参数二是截取返回这个字符串的结束点,并且不包含这个结束点。而它们的参数一,都是一样的功能,截取的起始位置。注意事项:substr的参数二如果为0或者负数,则返回一个空字符串,如果未填入,则会截取到字符串的结尾去。substring的参数一和参数二为NAN或者负数,那么它将被替换为0。conststrABCDEFGHIJKLMNconsole。log(str。substr(2))输出CDEFGHIJKLMNconsole。log(str。substring(2))输出CDEFGHIJKLMNconsole。log(str。substr(2,9))输出CDEFGHIJKconsole。log(str。substring(2,9))输出CDEFGHI复制代码7。match() match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,并返回一个包含该搜索结果的数组。conststr2018年结束了,2019年开始了,2020年就也不远了constregdg这里是定义匹配规则,匹配字符串里的1到多个数字console。log(str。match(reg))输出符合匹配规则的内容,以数组形式返回〔2018,2019,2020〕console。log(str。match(20))不使用正则〔20,index:0,input:2018年结束了,2019年开始了〕复制代码 注意事项:如果match方法没有找到匹配,将返回null。如果找到匹配,则match方法会把匹配到以数组形式返回,如果正则规则未设置全局修饰符g,则match方法返回的数组有两个特性:input和index。input属性包含整个被搜索的字符串。index属性包含了在整个被搜索字符串中匹配的子字符串的位置。8。replace() replace接收两个参数,参数一是需要替换掉的字符或者一个正则的匹配规则,参数二,需要替换进去的字符,仔实际的原理当中,参数二,你可以换成一个回调函数。conststr2018年结束了,2019年开始了,2020年就也不远了constrexdg这里是定义匹配规则,匹配字符串里的1到多个数字conststr1str。replace(rex,)console。log(str1)输出:年结束了,年开始了,年也不远了conststr2str。replace(rex,function(item){console。log(arguments)看下面的图片constarr〔零,壹,贰,叁,肆,伍,陆,柒,捌,玖〕letnewStritem。split()。map(function(i){newStrarr〔i〕})returnnewStr})console。log(str2)输出:贰零壹捌年结束了,贰零壹玖年开始了,贰零贰零年也不远了复制代码9。search() 在目标字符串中搜索与正则规则相匹配的字符,搜索到,则返回第一个匹配项在目标字符串当中的位置,没有搜索到则返回一个1。conststr2018年结束了,2019年开始了,2020年就也不远了constregdi这里是定义匹配规则,匹配字符串里的1到多个数字console。log(str。search(reg))输出0这里搜索到的第一项是从位置0开始的复制代码10。toLowerCase(),toUpperCase() toLowerCase把字母转换成小写,toUpperCase()则是把字母转换成大写。conststr1abcdefgconststr2ABCDEFGconsole。log(str2。toLowerCase())输出:abcdefgconsole。log(str1。toUpperCase())输出:ABCDEFG复制代码11。includes(),startsWith(),endsWith() includes、startsWith、endsWith,es6的新增方法,includes用来检测目标字符串对象是否包含某个字符,返回一个布尔值,startsWith用来检测当前字符是否是目标字符串的起始部分,相对的endwith是用来检测是否是目标字符串的结尾部分。conststrExcuseme,howdoIgettoparkroad?console。log(str。includes(how))输出:trueconsole。log(str。startsWith(Excuse))输出:trueconsole。log(str。endsWith(?))输出:true复制代码12。repeat() 返回一个新的字符串对象,新字符串等于重复了指定次数的原始字符串。接收一个参数,就是指定重复的次数。原字符串不变。conststrhttpconststr2str。repeat(3)console。log(str)输出:httpconsole。log(str2)输出:httphttphttp复制代码三、常用遍历方法高阶函数1。for() 最常用的for循环,经常用的数组遍历,也可以遍历字符串。constarr〔1,2,3〕conststrabcfor(leti0;iarr。i){console。log(arr〔i〕)console。log(str〔i〕)}复制代码2。while()dowhile() while、dowhile主要的功能是,当满足while后边所跟的条件时,来执行相关业务。这两个的区别是,while会先判断是否满足条件,然后再去执行花括号里面的任务,而dowhile则是先执行一次花括号中的任务,再去执行while条件,判断下次还是否再去执行do里面的操作。也就是说dowhile至少会执行一次操作。while(条件){执行。。。}do{执行。。。}while(条件)复制代码3。forEach() 拷贝一份遍历原数组。return无法终止循环。不过可以起到continue效果。本身是不支持的continue与break语句的我们可以通过some和every来实现。constarr〔5,1,3,7,4〕arr。forEach((item,index){if(item2)returnconsole。log(索引:{index},数值:{item})arr〔5〕0})console。log(arr)打印结果:索引:0,数值:5索引:2,数值:3索引:3,数值:7索引:4,数值:4〔5,1,3,7,4,0〕复制代码4。for。。。infor。。。in是ES5标准,此方法遍历数组效率低,主要是用来循环遍历对象的属性。遍历数组的缺点:数组的下标index值是数字,forin遍历的index值0,1,2等是字符串。Object。defineProperty,建立的属性,默认不可枚举。constfoo{name:bar,sex:male}Object。defineProperty(foo,age,{value:18})for(constkeyinfoo){console。log(可枚举属性:{key})}console。log(age属性:{foo。age})打印结果:可枚举属性:name可枚举属性:sexage属性:18复制代码5。for。。。of forof是ES6新增的方法,但是forof不能去遍历普通的对象,forof的好处是可以使用break跳出循环。forof这个方法避开了forin循环的所有缺陷与forEach()不同的是,它可以正确响应break、continue和return语句forof循环不仅支持数组,还支持大多数类数组对象,例如DOMNodeList对象〔6〕。forof循环也支持字符串遍历forof循环直接得到的就是值constarr〔1,2,3〕for(constvalueofarr){console。log(value)}复制代码 面试官:说一下for。。。in和for。。。of区别?(1)forin用于可枚举数据,如对象、数组、字符串(2)forof用于可迭代数据,如数组、字符串、Map、Set复制代码6。everysome 返回一个布尔值。当我们需要判定数组中的元素是否满足某些条件时,可以使用everysome。这两个的区别是,every会去判断判断数组中的每一项,而some则是当某一项满足条件时返回。everyconstfoo〔5,1,3,7,4〕。every((item,index){console。log(索引:{index},数值:{item})returnitem2})console。log(foo)every打印:索引:0,数值:5索引:1,数值:1false复制代码someconstfoo〔5,1,3,7,4〕。some((item,index){console。log(索引:{index},数值:{item})returnitem2})console。log(foo)some打印:索引:0,数值:5true复制代码7。filter()filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。constfoo〔5,1,3,7,4〕。filter((item,index){console。log(索引:{index},数值:{item})returnitem2})console。log(foo)打印结果:索引:0,数值:5索引:1,数值:1索引:2,数值:3索引:3,数值:7索引:4,数值:4〔5,3,7,4〕复制代码8。map()map即是映射的意思,原数组被映射成对应新数组。map:支持return,相当与原数组克隆了一份,把克隆的每项改变了,也不影响原数组。constfoo〔5,1,3,7,4〕。map((item,index){console。log(索引:{index},数值:{item})returnitem2})console。log(foo)打印结果:索引:0,数值:5索引:1,数值:1索引:2,数值:3索引:3,数值:7索引:4,数值:4〔7,3,5,9,6〕复制代码9。reduce()reduceRight() reduce从左到右将数组元素做叠加处理,返回一个值。reduceRight从右到左。constfoo〔5,1,3,7,4〕。reduce((total,cur){console。log(叠加:{total},当前:{cur})returntotalcur})console。log(foo)打印结果:叠加:5,当前:1叠加:6,当前:3叠加:9,当前:7叠加:16,当前:420复制代码10。Object,keys遍历对象的属性 Object。keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名,且只返回可枚举的属性。constobj{p1:123,p2:456};Object。keys(obj)〔p1,p2〕复制代码11。Object。getOwnPropertyNames()遍历对象的属性 Object。getOwnPropertyNames方法与Object。keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但它能返回不可枚举的属性。constarr〔Hello,World〕;Object。keys(arr)〔0,1〕Object。getOwnPropertyNames(arr)〔0,1,length〕复制代码以上遍历方法的区别:一:map(),forEach(),filter()循环的共同之处:1。forEach,map,filter循环中途是无法停止的,总是会将所有成员遍历完。2。他们都可以接受第二个参数,用来绑定回调函数内部的this变量,将回调函数内部的this对象,指向第二个参数,间接操作这个参数(一般是数组)。二:map()、filter()循环和forEach()循环的不同:forEach循环没有返回值;map,filter循环有返回值。三:map()和filter()都会跳过空位,for和while不会四:some()和every():some()只要有一个是true,便返回而every()只要有一个是false,便返回false。五:reduce(),reduceRight():reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员)。六:Object对象的两个遍历Object。keys与Object。getOwnPropertyNames:他们都是遍历对象的属性,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但Object。keys不能返回不可枚举的属性;Object。getOwnPropertyNames能返回不可枚举的属性。复制代码四、常用正则表达式 这里罗列一些我在刷算法题中遇到的正则表达式,如果有时间可认真学一下正则表达式不要背〔7〕。1。判断字符由26个英文字母组成的字符串:〔AZaz〕由26个大写英文字母组成的字符串:〔AZ〕由26个小写英文字母组成的字符串:〔az〕由数字和26个英文字母组成的字符串:〔AZaz09〕复制代码2。判断数字数字:〔09〕复制代码 持续更新,敬请期待五、数学知识1。质数 若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为质数(或素数),否则称该正整数为合数。functionjudgePrime(n){for(leti2;i){if(ni0)returnfalse}returntrue}复制代码2。斐波那契数列functionFibonacci(n){if(n1)returnnreturnFibonacci(n1)Fibonacci(n2)}复制代码