JavaScript数组方法的总结 本文主要介绍常用的数组方法
、字符串方法
、遍历方法
、高阶函数
、正则表达式
以及相关数学知识
。
常用方法 push()
在尾部追加,类似于压栈,原数组会改变。
1 2 3 const arr = [1 , 2 , 3 ]arr.push (8 ); console .log (arr)
push()
方法返回的是数组的长度1 2 let arr=[1 ,2 ]return console .log (arr.push (1111 ))
pop()
在尾部弹出,类似于出栈,原数组会变。数组的 push
& pop
可以模拟常见数据结构:栈 。
1 2 3 4 5 6 7 8 9 10 11 12 13 const arr = [1 , 2 , 3 ]const popVal = arr.pop ()console .log (popVal) console .log (arr) const stack = [0 , 1 ]stack.push (2 ) console .log (stack) const popValue = stack.pop () console .log (popValue) console .log (stack)
unshift()
在头部压入数据,类似于入队,原数组会变。
1 2 3 const arr = [1 , 2 , 3 ]arr.unshift (0 ) console .log (arr)
shift()
在头部弹出数据,原数组会变。数组的 push
(入队) & shift
(出队) 可以模拟常见数据结构之一:队列 。
1 2 3 4 5 6 7 8 9 10 11 12 13 const arr = [1 , 2 , 3 ]const shiftVal = arr.shift ()console .log (shiftVal) console .log (arr) const queue = [0 , 1 ]queue.push (2 ) console .log (queue) const shiftValue = queue.shift () console .log (shiftValue) console .log (queue)
concat()
concat
会在当前数组尾部拼接传入的数组,然后返回一个新数组,原数组不变 。
1 2 3 4 const arr = [1 , 2 , 3 ]const arr2 = arr.concat ([7 , 8 , 9 ])console .log (arr) console .log (arr2)
indexOf()
在数组中寻找该值,找到则返回其下标,找不到则返回-1
。
1 2 3 const arr = [1 , 2 , 3 ]console .log (arr.indexOf (2 )) console .log (arr.indexOf (0 ))
includes()
在数组中寻找该值,找到则返回true
,找不到则返回false
。
1 2 3 const arr = [1 , 2 , 3 ]console .log (arr.includes (2 )) console .log (arr.includes (4 ))
join()
将数组转化成字符串,并返回该字符串,不传值则默认逗号隔开,原数组不变。
1 2 3 const arr = [1 , 2 , 3 ]console .log (arr.join ()) console .log (arr)
reverse()
翻转原数组,并返回已完成翻转的数组,原数组改变。
1 2 3 const arr = [1 , 2 , 3 ]console .log (arr.reverse ()) console .log (arr)
slice(start,end)
从start
开始截取到end
,但是不包括end
,不改变原数组,返回的是一个新数组。
1 2 3 const arr = [1 , 2 , 3 , 4 , 5 ]console .log (arr.slice (1 , 4 )) console .log (arr)
splice(start, deleteCount, item1, item2……)
start
参数 开始的位置
deleteCount
要截取的个数
后面的items
为要添加的元素
如果deleteCount
为0
,则表示不删除元素,从start
位置开始添加后面的几个元素到原始的数组里面。
返回值为由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
这个方法会改变原始数组,数组的长度会发生变化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const arr3 = [1 , 2 , 3 , 4 , 5 , 6 , 7 , "f1" , "f2" ];const arr4 = arr3.splice (2 , 3 ) console .log (arr4); console .log (arr3); const arr5 = arr3.splice (2 , 0 , "wu" , "leon" ); console .log (arr5); console .log (arr3); const arr6 = arr3.splice (2 , 3 , "xiao" , "long" );console .log (arr6); console .log (arr3); const arr7 = arr3.splice (2 ); console .log (arr7);console .log (arr3);
sort()
对数组的元素进行排序,并返回数组。
默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16
代码单元值序列时构建的。
由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。
可参考 MDN:Sort [5]
1 2 3 const arr = [1 , 2 , 3 ]arr.sort ((a, b ) => b - a) console .log (arr)
toString() 将数组转化成字符串,并返回该字符串,逗号隔开,原数组不变。
1 2 3 const arr = [1 , 2 , 3 , 4 , 5 ]console .log (arr.toString ()) console .log (arr)
字符串常用方法 charAt()
返回指定索引位置处的字符。类似于数组用中括号获取相应下标位置的数据。
1 2 3 var str = 'abcdefg' console .log (str.charAt (2 )) console .log (str[2 ])
concat()
类似数组的concat(),用来返回一个合并拼接两个或两个以上字符串。原字符串不变。
1 2 3 4 const str1 = 'abcdefg' const str2 = '1234567' const str3 = str1.concat (str2)console .log (str3)
indexOf()、lastIndexOf()
indexOf
,返回一个字符在字符串中首次出现的位置,lastIndexOf
返回一个字符在字符串中最后一次出现的位置。
1 2 3 const str = 'abcdcefcg' console .log (str.indexOf ('c' )) console .log (str.lastIndexOf ('c' ))
slice()
提取字符串的片断,并把提取的字符串作为新的字符串返回出来。原字符串不变。
1 2 3 4 const str = 'abcdefg' console .log (str.slice ()) console .log (str.slice (1 )) console .log (str.slice (2 , str.length -1 ))
split()
使用指定的分隔符将一个字符串拆分为多个子字符串数组并返回,原字符串不变。
1 2 const str = 'A*B*C*D*E*F*G' console .log (str.split ('*' ))
substr(), substring()
这两个方法的功能都是截取一个字符串的片段,并返回截取的字符串。
substr
和substring
这两个方法不同的地方就在于参数二,substr
的参数二是截取返回出来的这个字符串指定的长度,substring
的参数二是截取返回这个字符串的结束点,并且不包含这个结束点。而它们的参数一,都是一样的功能,截取的起始位置。
注意事项 :substr
的参数二如果为0
或者负数,则返回一个空字符串,如果未填入,则会截取到字符串的结尾去。substring
的参数一和参数二为NAN
或者负数,那么它将被替换为0
。
1 2 3 4 5 6 const str = 'ABCDEFGHIJKLMN' console .log (str.substr (2 )) console .log (str.substring (2 )) console .log (str.substr (2 , 9 )) console .log (str.substring (2 , 9 ))
match()
match()
方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,并返回一个包含该搜索结果的数组。
1 2 3 4 const str = '2018年结束了,2019年开始了,2020年就也不远了' const reg = /\d+/g console .log (str.match (reg)) console .log (str.match ('20' ))
注意事项 :如果match
方法没有找到匹配,将返回null
。如果找到匹配,则 match
方法会把匹配到以数组形式返回,如果正则规则未设置全局修饰符g
,则 match
方法返回的数组有两个特性:input
和index
。input
属性包含整个被搜索的字符串。index
属性包含了在整个被搜索字符串中匹配的子字符串的位置。
replace()
replace
接收两个参数,参数一是需要替换掉的字符或者一个正则的匹配规则,参数二,需要替换进去的字符,仔实际的原理当中,参数二,你可以换成一个回调函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 const str = '2018年结束了,2019年开始了,2020年就也不远了' const rex = /\d+/g const str1 = str.replace (rex, '****' ) console .log (str1) const str2 = str.replace (rex, function (item ){ console .log (arguments ) const arr = ['零' , '壹' , '贰' , '叁' , '肆' , '伍' , '陆' , '柒' , '捌' , '玖' ] let newStr = '' item.split ('' ).map (function (i ){ newStr += arr[i] }) return newStr }) console .log (str2)
search()
在目标字符串中搜索与正则规则相匹配的字符,搜索到,则返回第一个匹配项在目标字符串当中的位置,没有搜索到则返回一个-1
。
1 2 3 const str = '2018年结束了,2019年开始了,2020年就也不远了' const reg = /\d+/i console .log (str.search (reg))
toLowerCase(),toUpperCase()
toLowerCase
把字母转换成小写,toUpperCase()
则是把字母转换成大写。
1 2 3 4 const str1 = 'abcdefg' const str2 = 'ABCDEFG' console .log (str2.toLowerCase ()) console .log (str1.toUpperCase ())
11.includes(), startsWith(), endsWith() includes
、startsWith
、endsWith
,es6
的新增方法,includes
用来检测目标字符串对象是否包含某个字符,返回一个布尔值,startsWith
用来检测当前字符是否是目标字符串的起始部分,相对的endwith
是用来检测是否是目标字符串的结尾部分。
1 2 3 4 const str = 'Excuse me, how do I get to park road?' console .log (str.includes ('how' )) console .log (str.startsWith ('Excuse' )) console .log (str.endsWith ('?' ))
12.repeat() 返回一个新的字符串对象,新字符串等于重复了指定次数的原始字符串。接收一个参数,就是指定重复的次数。原字符串不变。
1 2 3 4 const str = 'http' const str2 = str.repeat (3 )console .log (str) console .log (str2)
常用遍历方法&高阶函数 for() 最常用的for
循环,经常用的数组遍历,也可以遍历字符串。
1 2 3 4 5 6 const arr = [1 , 2 , 3 ]const str = 'abc' for (let i = 0 ; i < arr.length ; i++) { console .log (arr[i]) console .log (str[i]) }
while() / do while() while
、do while
主要的功能是,当满足while
后边所跟的条件时,来执行相关业务。这两个的区别是,while
会先判断是否满足条件,然后再去执行花括号里面的任务,而do while
则是先执行一次花括号中的任务,再去执行while
条件,判断下次还是否再去执行do
里面的操作。也就是说 do while
至少会执行一次操作 .
1 2 3 4 5 6 7 8 while (条件){ 执行... } do { 执行... } while (条件)
forEach() 拷贝一份遍历原数组。
return
无法终止循环。不过可以起到continue
效果。
本身是不支持的continue
与break
语句的我们可以通过some
和 every
来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 const arr = [5 ,1 ,3 ,7 ,4 ]arr.forEach ((item, index ) => { if (item < 2 ) return console .log (`索引:${index} ,数值:${item} ` ) arr[5 ] = 0 }) console .log (arr)
for…in
用法 :for...in
用于遍历对象的可枚举属性 ,包括数组和对象。
遍历内容 :for...in
遍历的是键 (属性名或索引),而不是值。
适用场景 :适合用来遍历对象的属性,特别是当我们需要访问属性名时。
for...in
是 ES5 标准, 此方法遍历数组效率低,主要是用来循环遍历对象的属性。
遍历数组的缺点:数组的下标index
值是数字,for-in
遍历的index
值"0","1","2"
等是字符串。
Object.defineProperty
,建立的属性,默认不可枚举。
1 2 3 4 5 6 7 8 9 10 11 const obj = { a : 1 , b : 2 , c : 3 };for (const key in obj) { console .log (key); console .log (obj[key]); } const arr = [10 , 20 , 30 ];for (const index in arr) { console .log (index); console .log (arr[index]); }
for…of
用法 :for...of
用于遍历可迭代对象 (如数组、字符串、Set
和 Map
等)。
遍历内容 :for...of
遍历的是值 ,即数组中的每个元素或字符串中的每个字符。
适用场景 :适合用来遍历数组或其他可迭代对象的内容。
for…of
是ES6
新增的方法,但是for…of
不能去遍历普通的对象,**for…of
的好处是可以使用break
跳出循环。**
for-of
这个方法避开了for-in
循环的所有缺陷
与forEach()
不同的是,它可以正确响应break
、continue
和return
语句
for-of
循环不仅支持数组,还支持大多数类数组对象,例如DOM
NodeList对象 [6]。
for-of
循环也支持字符串遍历
1 2 3 4 5 6 7 8 9 const arr = [10 , 20 , 30 ];for (const value of arr) { console .log (value); } const str = "Hello" ;for (const char of str) { console .log (char); }
区别总结
特性
for...of
for...in
遍历内容
值 (元素或字符)
键 (属性名或索引)
遍历对象
可迭代对象 (数组、字符串、Set
、Map
等)
对象属性 (包括数组的索引)
适合场景
遍历数组、字符串、Set
、Map
等的内容
遍历对象的属性
是否可用于对象
否 (不适合遍历普通对象)
是
是否可用于数组
是
是,但不推荐
注意
for...in
不推荐用于数组 :因为它遍历的是索引而不是值,同时还可能会遍历到数组的继承属性,造成不必要的混乱。一般在数组的场景中优先使用 for...of
。
for...of
不适合遍历对象 :因为对象并不是可迭代的。如果需要遍历对象的键值对,推荐使用 for...in
或 Object.entries()
方法搭配 for...of
。
建议
数组 :使用 for...of
来遍历值,或使用 forEach
。
对象 :使用 for...in
来遍历属性名,或使用 Object.keys()
/ Object.entries()
结合 for...of
。
every / some 返回一个布尔值 。当我们需要判定数组中的元素是否满足某些条件时,可以使用every
/ some
。这两个的区别是,every
会去判断判断数组中的每一项,而 some
则是当某一项满足条件时返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 const foo = [5 ,1 ,3 ,7 ,4 ].every ((item, index ) => { console .log (`索引:${index} ,数值:${item} ` ) return item > 2 }) console .log (foo)const foo = [5 ,1 ,3 ,7 ,4 ].some ((item, index ) => { console .log (`索引:${index} ,数值:${item} ` ) return item > 2 }) console .log (foo)
filter()
filter
方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true
的成员组成一个新数组返回。
该方法不会改变原数组。
1 2 3 4 5 6 7 8 9 10 11 12 const foo = [5 ,1 ,3 ,7 ,4 ].filter ((item,index ) => { console .log (`索引:${index} ,数值:${item} ` ) return item > 2 }) console .log (foo)
map()
map
即是 “映射”的意思 ,原数组被“映射”成对应新数组。
map:
支持return
,相当与原数组克隆了一份,把克隆的每项改变了,也不影响原数组。
1 2 3 4 5 6 7 8 9 10 11 12 javascriptjavascriptjavascriptconst foo = [5 ,1 ,3 ,7 ,4 ].map ((item,index ) => { console .log (`索引:${index} ,数值:${item} ` ) return item + 2 }) console .log (foo)
reduce() / reduceRight() reduce
从左到右将数组元素做“叠加”处理,返回一个值。reduceRight
从右到左。
1 2 3 4 5 6 7 8 9 10 11 const foo = [5 ,1 ,3 ,7 ,4 ].reduce ((total, cur ) => { console .log (`叠加:${total} ,当前:${cur} ` ) return total + cur }) console .log (foo)
可以用来去重 1 2 3 4 5 6 7 8 9 10 11 const arr = [1 , 2 , 3 , 3 , 4 , 5 , 5 , 6 ];const uniqueArr = arr.reduce ((accumulator, currentValue ) => { if (!accumulator.includes (currentValue)) { accumulator.push (currentValue); } return accumulator; }, []); console .log (uniqueArr);
Object,keys遍历对象的属性 Object.keys
方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名,且只返回可枚举的属性。
1 2 3 4 5 const obj = { p1 : 123 , p2 : 456 }; Object .keys (obj)
Object.getOwnPropertyNames() 遍历对象的属性 Object.getOwnPropertyNames
方法与Object.keys
类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但它能返回不可枚举的属性。
1 2 3 const arr = ['Hello' , 'World' ];Object .keys (arr) Object .getOwnPropertyNames (arr)
以上遍历方法的区别: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 一:map (),forEach (),filter ()循环的共同之处: 1. forEach,map,filter循环中途是无法停止的,总是会将所有成员遍历完。 2. 他们都可以接受第二个参数,用来绑定回调函数内部的 this 变量,将回调函数内部的 this 对象,指向第二个参数,间接操作这个参数(一般是数组)。 二:map ()、filter ()循环和forEach ()循环的不同: forEach 循环没有返回值;map,filter 循环有返回值。 三:map ()和filter ()都会跳过空位,for 和 while 不会 四:some ()和every (): some ()只要有一个是true ,便返回true ;而every ()只要有一个是false ,便返回false . 五:reduce (),reduceRight (): reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员)。 六:Object 对象的两个遍历 Object .keys 与 Object .getOwnPropertyNames : 他们都是遍历对象的属性,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但Object .keys 不能返回不可枚举的属性;Object .getOwnPropertyNames 能返回不可枚举的属性。
常用正则表达式 这里罗列一些我在刷算法题中遇到的正则表达式,如果有时间可认真学一下正则表达式不要背 [7]。
1.判断字符 1 2 3 4 由26 个英文字母组成的字符串:^[A-Za -z]+$ 由26 个大写英文字母组成的字符串:^[A-Z]+$ 由26 个小写英文字母组成的字符串:^[a-z]+$ 由数字和26 个英文字母组成的字符串:^[A-Za -z0-9 ]+$
2.判断数字
持续更新,敬请期待……
数学知识 1.质数 若一个正整数无法被除了1
和它自身之外的任何自然数整除,则称该数为质数(或素数),否则称该正整数为合数。
1 2 3 4 5 6 function judgePrime (n ) { for (let i = 2 ; i * i <= n; i++) { if (n % i == 0 ) return false } return true }
2.斐波那契数列 1 2 3 4 function Fibonacci (n) { if (n <= 1 ) return n return Fibonacci(n - 1 ) + Fibonacci(n - 2 ) }