一、创建数组
创建数组的基本方式有两种:
- 使用Array构造函数
1 | const arr1 = new Array(); // 创建一个空数组 |
- 使用数组字面量表示法
1 | const colors = ['red', 'blue', 'green']; // 创建一个包含3个字符串的数组 |
二、数组检测方法
Array.isArray()
方法
这个方法(ES5新增)用于检测某个值是否是数组,IE8不支持!
1 | if(Array.isArray(value)) { |
三、改变原数组的方法
toString()
方法
- 返回值:每个数组元素以逗号分隔拼接成的字符串
- 是否修改原数组:否
toString()
方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串,因此,该方法并不会改变原数组。
示例代码如下:
1 | const arr = ['富强', '民主', '文明', '和谐']; |
pop()
方法
- 返回值:移除的数组的最后一个元素
- 是否修改原数组:是
pop()
方法:移除数组末尾最后一个元素,减少数组的length
值,并返回移除的项。因此,该方法会改变原数组。
示例代码如下:
1 | const popArr = [11, 7, 6, 24, 42, 5]; |
push()
方法
- 返回值:修改后数组的长度
- 是否修改原数组:是
push()
方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。因此,该方法会改变原数组。
示例代码如下:
1 | const pushArr = ['富强', '民主', '文明']; // 创建一个数组 |
在上述代码中,向数组中只推入了一个元素,你也可以一次性地推入多个元素。
例如:
1 | const colors = new Array(); // 创建一个数组 |
但是,请注意🔔🔔🔔
如果想向一个数组中一次性推入多个元素时,不要把它们作为数组进行推入,这会把整个数组当成一个元素,推入到数组中。
例如:
1 | const nums = [11, 7, 6, 24, 42, 5]; |
shift()
方法
- 返回值:移除的数组的第一个元素
- 是否修改原数组:是
shift()
方法:移除数组的第一项,减少数组的length
值,并返回移除的项。因此,该方法会改变原数组。
示例代码如下:
1 | const shiftArr = [11, 7, 6, 24, 42, 5]; |
unshift()
方法
- 返回值:修改后数组的长度
- 是否修改原数组:是
unshift()
方法:它可以接收任意数量的参数,把它们逐个添加到数组开头,并返回修改后的数组的长度。因此,该方法会改变原数组
示例代码如下:
1 | const unshiftArr = [11, 7, 6, 24, 42, 5]; |
与push()
方法类似,你也可以一次性地在数组的开头添加多个元素。
例如:
1 | const colors = new Array(); // 创建一个数组 |
但是,请注意🔔🔔🔔
如果想向一个数组开头一次性添加多个元素时,不要把它们作为数组进行添加,这会把整个数组当成一个元素,添加到数组开头。
例如:
1 | const nums = [11, 7, 6, 24, 42, 5]; |
sort()
方法
- 返回值:排序后的数组
- 是否修改原数组:是
sort()
方法是采用原地排序算法进行排序的,因此,会改变原数组。
sort()
方法会调用每个数组项的.toString()
方法,然后比较得到的字符串,以确定如何排序。对于非字符串类型的数组元素,可以通过向sort()
方法中传入比较函数,实现数值之类的排序。
示例代码如下:
1 | const sortArr = [11, 7, 6, 24, 42, 5]; |
如何理解sort()
方法的比较函数呢?可以看下面这篇非常啰嗦的文章:
:point_right: 理解JavaScript中的sort方法
reverse()
方法
- 返回值:反转后的数组
- 是否修改原数组:是
reverse()
方法:反转数组元素的顺序。
示例代码如下:
1 | const reverseArr = [11, 7, 6, 24, 42, 5]; |
🎖splice()
方法
- 返回值:被删除的项目
- 是否修改原数组:是
splice()
方法向/从数组中添加/删除/替换项目,然后返回被删除的项目(如果没有删除,则返回一个空数组)
splice()
可以接受三个参数,该方法比较强大,它的功能是向数组中添加元素,还是删除元素,还是替换元素,取决于第二个参数deleteCount
。
该方法的参数有如下三个:
- 第一个参数是
start
:必需,代表起始位置 - 第二个参数是
deleteCount
:可选,要删除的元素数量 - 第三个参数
items
:可选,向数组添加的新项目
删除操作
示例代码如下:
1 | // 删除操作 |
由于指定了第2个参数,指定要减少一些元素,又没有指定第3个参数,没有增添新元素,所以这个肯定是删除操作。那么,上面代码中,调用该方法后的返回值,就是删除的元素。最终的功能就是从数组中删除元素。
添加操作
示例代码如下:
1 | // 添加操作 |
当指定了第2个参数和第3个参数时,只要添加的元素数目多于删除的元素的数目,最终的功能就是向数组中添加元素。
替换操作
示例代码如下:
1 | // 添加操作 |
当指定了第2个参数和第3个参数时,如果添加的元素数目等于删除的元素数目,最终的功能就是替换数组中的元素。
四、不改变原数组的方法
toString()
方法
- 返回值:数组每一项元素以逗号分隔,拼接成的字符串
- 是否修改原数组:否
toString()
方法:
示例代码如下:
1 | const arr = ['富强', '民主', '文明', '和谐']; |
当数组和字符串进行操作,或者将数组传入需要接收字符串参数的函数中时,JavaScript
会自动调用这个方法将数组转换成字符串。
例如:
1 | const arr = [11, 7, 6, 24, 42, 5]; |
join()
方法
- 返回值:数组每一项元素以指定分隔符拼接成的字符串
- 是否修改原数组:否
join()
方法:接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。如果不传入参数,或者传入undefined
,则使用逗号作为分隔符。
示例代码如下:
1 | const joinArr = [11, 7, 6, 24, 42, 5]; |
concat()
方法
- 返回值:拼接成的新数组
- 是否修改原数组:否
concat()
方法:基于当前数组中的所有项创建一个新数组。这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。
示例代码如下:
1 | const concatArr = [11, 7, 6, 24, 42, 5]; |
与push()
、unshift()
方法不同的是:
- 当向
concat()
方法中传入的参数是一个或多个数组时,会把该数组中的元素逐个添加到结果数组中 - 当向
concat()
方法中传入的参数不是数组,传入的参数将被简单地添加到数组的末尾。
slice()
方法
- 返回值:
- 是否修改原数组:否
slice()
(切片)方法:基于当前数组中的一个或多个项创建一个新数组。它接受一个或两个参数,即要返回项的起始和结束位置。
- 当只有一个参数时,
slice()
方法返回从该参数指定的位置到当前数组末尾的所有项 - 当有两个参数时,
slice()
方法返回起始和结束位置(不包括结束位置)之间的项
示例代码如下:
1 | const sliceArr = [11, 7, 6, 24, 42, 5]; |
如果
slice()
方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置
indexOf()
方法
- 返回值:元素的下标索引
- 是否修改原数组:否
indexOf()
方法返回在数组中找到的给定元素的第一次出现的位置索引,如果不存在,则返回-1。
该方法接受两个参数:
- 第一个参数:要查找的元素
- 第二个参数:可选,查找的起始位置(有一点不要弄混,即使指定了查找的起始位置,最终返回的元素索引仍然按数组的下标起始位置算起)
示例代码如下:
1 | const indexOfArr = [11, 7, 6, 24, 42, 5]; |
数组的indexOf()
操作方法与字符串的indexOf()
操作方法有些不一样,数组的indexOf()
方法使用严格相等搜索元素,即元素要完全匹配才能搜索成功。另外,indexOf()
不能识别NaN
。
例如:
1 | let a=['啦啦',2,4,24,NaN] |
lastIndexOf()
方法
- 返回值:元素的下标索引
- 是否修改原数组:否
lastIndexOf()
方法和indexOf()
方法都是用来在数组中搜索元素的,区别在于lastIndexOf()
是从后往前开始搜索。
该方法接受两个参数:
- 第一个参数:要查找的元素
- 第二个参数:可选,查找的起始位置。(默认值为-1,代表从最后一个元素开始向前查找,同理,-2的话,代表从倒数第二个元素开始向前查找,当然,你也可以使用正值,代表从第几个元素开始向前查找)
示例代码如下:
1 | const lindexOfArr = [11, 7, 6, 24, 42, 5]; |
五、遍历方法
以下的遍历方法和归并方法都不会修改原数组
map()
方法
- 返回值:对原数组每一项调用函数后的结果组成的数组
- 是否修改原数组:否
map()
方法:对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
该方法接受两个参数:
- 第一个参数:
callbackfn(value,index,array)
要在每一项上运行的函数currentvalue
:遍历时当前数组元素的值index
:可选,遍历时当前数组元素的索引值array
:可选,map()
方法正在操作的数组
- 第二个参数:
thisArg
,可选,运行该函数的作用域对象(this)
接下来分多种情况,分别展示一下callbackfn()
函数接受不同参数的情况:
示例代码如下:
- 接受一个参数
当只接受1个参数时,这个参数代表每一次遍历时的数组元素
1 | const mapArr = [11, 7, 6, 24, 42, 5]; |
- 接受两个参数
当接受2个参数时,第一个参数代表每一次遍历的数组元素,第二个参数代表该元素的索引值
1 | const mapArr = const mapArr = [11, 7, 6, 24, 42, 5]; |
运行结果如下:
1 | 11 0 |
- 接受三个参数
当接受3个参数时,第三个参数代表原数组本身
1 | const mapArr = const mapArr = [11, 7, 6, 24, 42, 5]; |
运行结果如下:
1 | 11 0 [ 11, 7, 6, 24, 42, 5 ] |
下面的方法中如果callbackfn()
函数参数基本上一致,就不再具体介绍
forEach()
方法
- 返回值:
undefined
- 是否修改原数组:否
forEach()
方法:以数组中的每一项运行给定函数。这个方法没有返回值。
该方法接受两个参数:
callbackfn(currentValue, index, array)
currentValue
:数组中正在处理的当前元素index
:可选,数组中正在处理的当前元素的索引array
:可选,forEach()
方法正在操作的数组
thisArg
:可选,运行该函数的作用域对象(this)
注意:
forEac()
方法总是返回undefined
,即使你return了一个值- 对于空数组是不会执行回调函数的
- 对于已经在迭代过程中删除的元素,或者空元素会跳过回调函数
- 遍历次数在第一次循环时就已经确定,再添加到数组中的元素不会被遍历
示例代码如下:
1 | const forEachArr = [11, 7, 6, , 42, 5]; |
运行结果如下:
1 | 13 0 |
every()
方法
- 返回值:布尔值
- 是否修改原数组:否
every()
方法:对数组中的每一项运行给定函数,如果该函数对每一项都返回true
,则返回true
该方法接受两个参数:
callbackfn(currentValue, index, array)
currentValue
:用于测试的当前值index
:可选,用于测试的当前值的索引array
:调用every()
方法的当前数组
thisArg
:执行callbackfn()
时使用的this
值
示例代码如下:
1 | const everyArr = [11, 7, 6, 24, 42, 5]; |
上述代码中,由于原数组存在不大于10的元素,例如,7 > 10
,这个式子将会返回false
,every()
方法就立即返回了false
some()
方法
- 返回值:布尔值
- 是否修改原数组:否
some()
方法:对数组中的每一项运行给定函数,如果该函数对任一项返回true
,则返回true
该方法接受两个参数:
callbackfn(currentValue, index, array)
:currentValue
:数组中正在处理的元素index
:可选,数组中正在处理的元素的索引值array
:调用some()
的数组
thisArg
:可选,执行callbackfn
时使用的this
值
示例代码如下:
1 | const someArr = [11, 7, 6, 24, 42, 5]; |
上述代码中,由于原数组存在大于10的元素,例如,11 > 10
,这个式子将会返回true
,some()
方法就会立即返回了true
。
filter()
方法
- 返回值:结果为true的项组成的数组
- 是否修改原数组:否
filter()
方法:对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
该方法接受两个参数:
callbackfn(currentValue, index, array)
:currentValue
:数组中正在处理的元素index
:可选,数组中正在处理的元素的索引值array
:调用filter()
的数组
thisArg
:可选,执行callbackfn
时使用的this
值
示例代码如下:
1 | const filterArr = [11, 7, 6, 24, 42, 5]; |
reduce()
方法
- 返回值:函数累计处理的结果
- 是否修改原数组:否
reduce()
方法:从数组的第一项开始,迭代数组的所有项,然后构建一个最终返回的值。
该方法接受两个参数:
callbackfn(previousValue, currentValue, currentIndex, array)
previousValue
:累计器计回调的返回值;它是上一次调用回调时返回的累计值,或者是初始值(如果设置了初始值,首次迭代时,就是初始值,后面的迭代是返回的累计值)currentValue
:当前正在处理的元素currentIndex
:可选,当前正在处理的元素的索引值array
:可选,调用reduce()
方法的数组
initialValue
:可选,归并的初始值
示例代码如下:
1 | const reduceArr = [11, 7, 6, 24, 42, 5]; |
在上述代码中,由于没有设置初始累计值,因此:
数组元素一共有6个,在开始迭代时,迭代次数已经确定,一共会调用5次回调函数,每次调用的参数及返回值如下:
callback |
previousValue |
currentValue |
index |
array |
返回值 |
---|---|---|---|---|---|
第一次调用 | 11 |
7 |
1 |
[ 11,7,6,24,42,5 ] |
18 |
第二次调用 | 18 |
6 |
2 |
[ 11,7,6,24,42,5 ] |
24 |
第三次调用 | 24 |
24 |
3 |
[ 11,7,6,24,42,5 ] |
48 |
第四次调用 | 48 |
42 |
4 |
[ 11,7,6,24,42,5 ] |
90 |
第五次调用 | 90 |
5 |
5 |
[ 11,7,6,24,42,5 ] |
95 |
如果reduce()
方法设置了初始值,那么首次迭代的pre
的值为初始值,cur
的值为数组第一个元素,其他往后类推即可。
reduceRight()
方法
- 返回值:函数累计处理的结果
- 是否修改原数组:否
reduceRight()
方法:从右至左遍历数组,然后构建一个最终返回的值
该方法接受两个参数:
callbackfn(pre, cur, index, arr)
pre
:首次调用回调函数时,如果设置了初始值initialValue
,则为初始值,如果没有设置初始值,则为数组最后一个元素。之后的迭代过程中,其值为上一次迭代时回调函数返回的值。cur
:当前正在处理的元素index
:当前正在处理的元素的索引值arr
:调用reduceRight()
的数组
initialValue
:可选,初始值
示例代码如下:
1 | const reduceRightArr = [11, 7, 6, 24, 42, 5]; |
数组元素一共有5个,在开始迭代时,迭代次数已经确定,一共会调用5次回调函数,每次调用的参数及返回值如下:
callback |
previousValue |
currentValue |
index |
array |
返回值 |
---|---|---|---|---|---|
第一次调用 | 5 |
42 |
4 |
[ 11,7,6,24,42,5 ] |
47 |
第二次调用 | 47 |
24 |
3 |
[ 11,7,6,24,42,5 ] |
71 |
第三次调用 | 71 |
6 |
2 |
[ 11,7,6,24,42,5 ] |
77 |
第四次调用 | 77 |
7 |
1 |
[ 11,7,6,24,42,5 ] |
84 |
第五次调用 | 84 |
11 |
0 |
[ 11,7,6,24,42,5 ] |
95 |
本文作者: CoderLeiShuo
本文链接:https://coderleishuo.github.io/lele/52440.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!