数组方法详解
JavaScript中数组的方法种类众多,在 ES3-ES7 不同版本时期都有新方法;并且数组的方法还有原型方法和从 object 继承的方法,这里我们只介绍数组在每个版本中原型上的方法,本文举例介绍了从 ES3 到 ES7 几乎所有的数组方法。
一、各版本数组方法一览表
数组方法名 | 对应版本 | 功能 | 原数组是否改变 |
---|---|---|---|
pop() | ES3- | 删除最后一位,并返回删除的数据 | 是 |
push() | ES3- | 在最后一位新增一或多个数据,返回长度 | 是 |
shift() | ES3- | 删除第一位,并返回删除的数据 | 是 |
unshift() | ES3- | 在第一位新增一或多个数据,返回长度 | 是 |
reverse() | ES3- | 反转数组,返回结果 | 是 |
sort() | ES3- | 排序(字符规则),返回结果 | 是 |
splice() | ES3- | 删除指 定位置,并替换,返回删除的数据 | 是 |
copyWithin() | ES6- | 指定位置的成员复制到其他位置 | 是 |
fill() | ES6- | 使用给定的值,填充到数组中,类似于替换 | 是 |
concat() | ES3- | 合并数组,并返回合并之后的数据 | 否 |
join() | ES3- | 使用分隔符,将数组转为字符串并返回 | 否 |
slice() | ES3- | 截取指定位置的数组,并返回 | 否 |
toString() | ES3- | 直接转为字符串,并返回 | 否 |
valueOf() | ES5- | 返回数组对象的原始值 | 否 |
indexOf() | ES5- | 查询并返回数据的索引 | 否 |
lastIndexOf() | ES5- | 反向查询并返回数据的索引 | 否 |
forEach() | ES5- | 参数为回调函数,会遍历数组所有的项,回调函数接受三个参数,分别为 value,index,self;forEach 没有返回值 | 否 |
map() | ES5- | 同 forEach,同时回调函数返回数据,组成新数组由 map 返回 | 否 |
filter() | ES5- | 同 forEach,同时回调函数返回布尔值,为 true 的数据组成新数组由 filter 返回 | 否 |
every() | ES5- | 同 forEach,同时回调函数返回布尔值,全部为 true,由 every 返回 true | 否 |
some() | ES5- | 同 forEach,同时回调函数返回布尔值,只要有一个为 true,由 some 返回 true | 否 |
reduce() | ES5- | 归并,同 forEach,迭代数组的所有项,并构建一个最终值,由 reduce 返回 | 否 |
reduceRight() | ES5- | 反向归并,同 forEach,迭代数组的所有项,并构建一个最终值,由 reduceRight 返回 | 否 |
from() | ES6- | 将类数组对象和可遍历对象转化为数组 | 否 |
of() | ES6- | 将一组值转化为数组 | 否 |
find() | ES6- | 在数组内部, 找到第一个符合条件的数组成员,返回值 | 否 |
findIndex() | ES6- | 在数组内部, 找到第一个符合条件的数组成员,返回索引 | 否 |
includes() | ES7- | 表示某个数组是否包含给定的值,与字符串的 includes()方法类似 | 否 |
二、方法详解
在讲解数组方法前,我们先简单将数组方法按上方表格内容分为下面两大类
(1)使用后会改变原数组
(2)使用后不会改变原数组
使用后原数组改变,失去原数组,得到改变后的新数组
1.pop()
功能:方法用于删除并返回数组的最后一个元素。
参数:无
var arr = [1, 2, 3];
console.log(arr.pop()); //3---删除并返回3
console.log(arr); //[1,2]---原数组改变
2.push()
功能:向数组的末尾添加一个或更多元素,并返回数组新的长度。
参数:push(newData1, newData2, ......)
var arr = [1, 2, 3];
console.log(arr.push("a")); //4---返回数组现在的长度
console.log(arr); //[1,2,3,"a"]---原数组改变
console.log(arr.push("hello", "world")); //6---一次可添加多个数组,返回新的数组长度
console.log(arr); //[1,2,3,"a","hello",world]---原数组改变
3.shift()
功能:方法用于删除并返回数组的第一个元素。
参数:无
var arr = [1, 2, 3];
console.log(arr.shift()); //1---返回被删除的元素
console.log(arr); //[2,3]---原数组改变
console.log(arr.shift()); //2---返回被删除的元素
console.log(arr); //[3]---原数组改变
4.unshift()
功能:向数组的开头添加一个或更多元素,并返回新的长度。
参数:unshift(newData1, newData2, ......)
var arr = [1, 2, 3];
console.log(arr.unshift("world")); //4---返回当前的数组长度
console.log(arr); //["world",1,2,3]---原数组改变
console.log(arr.unshift("a", "b", "hello")); //7---返回当前的数组长度,可一次性添加多个元素
console.log(arr); //["a","b","hello","world",1,2,3]---原数组改变
5.reverse()
功能:颠倒数组中元素的顺序,并返回更改后的数组
参数:无
var arr = [1, 2, 3];
console.log(arr.reverse()); //[3,2,1]---返回颠倒后的数组
console.log(arr); //[3,2,1]---原数组改变
6.sort()
功能:对数组中的元素进行排序,默认是升序,返回新数组
参数:无
var arr = [6, 1, 5, 2, 3, 4];
console.log(arr.sort()); //[1, 2, 3, 4, 5, 6]---返回排序后的新数组,默认升序排列
console.log(arr); //[1, 2, 3, 4, 5, 6]---原数组改变
注意:但是在排序前,会先调用数组的toString方法,将每个元素都转成字符之后,再进行排序,此时会按照字符串的排序,逐位比较,进行排序。
var arr = [6, 1024, 52, 256, 369];
console.log(arr.sort()); //[1024, 256, 369, 52, 6]---按照第一个字符的大小排序,多位数值的排序会出错
console.log(arr); //[1024, 256, 369, 52, 6]---原数组改变
解决方法:通过回调函数实现
参数:sort(callback)
如果需 要按照数值排序,需要传参。sort(callback),callback 为回调函数,该函数应该具有两个参数,比较这两个参数,然后返回一个用于说明这两个值的相对
顺序的数字(a-b)。其返回值如下: 若 a 小于 b,返回一个小于 0 的值。 若 a 等于 b,则返回 0。 若 a 大于 b,则返回一个大于 0 的值。
1)从小到大排序
var arr = [6, 1024, 52, 256, 369];
console.log(arr.sort(fn)); //[6, 52, 256, 369, 1024]---排序正常升序
console.log(arr); //[6, 52, 256, 369, 1024]---原数组改变
function fn(a, b) {
return a - b;
}
2)从大到小排序
var arr = [6, 1024, 52, 256, 369];
console.log(arr.sort(fn)); //[1024, 369, 256, 52, 6]---排序正常降序
console.log(arr); //[1024, 369, 256, 52, 6]---原数组改变
function fn(a, b) {
return b - a;
}
7.splice()
功能:向数组中添加,或从数组删除,或替换数组中的元素,然后返回被删除/替换的元素。
参数:splice(start,num,data1,data2,...); 所有参数全部可选;分为多种情 况
start:整数,规定添加/删除项目位置的索引,使用负数可从数组结尾处规定删除的位置
num:整数,规定要删除元素的数量,若为 0 则不会删除
data1,data2,data3.....:可选,规定需要添加的元素
(1)不传参时:无操作
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice()); //[]---不传参,不操作,没有没删除替换的元素,返回空数组
console.log(arr); //["Tom","Jack","Lucy","Lily","May"]---无操作,原数组未变,返回原数组
(2)只传入 start:表示从索引为 start 的数据开始删除,直到数组结束
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice(2)); //["Lucy", "Lily", "May"]--从索引为2开始删除,直到结束,返回被删除的数组
console.log(arr); //["Tom", "Jack"]---原数组改变,返回改变后的数组
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice(0)); //["Tom","Jack","Lucy","Lily","May"]--从索引为0开始删除,直到结束
console.log(arr); //[]---原数组数据被全部删除,返回空数组
(3)传入 start 和 num:表示从索引为 start 的数据开始删除,删除 num 个
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice(1, 3)); //["Jack", "Lucy", "Lily",]---从索引为2开始删除,删除3个元素
console.log(arr); //["Tom", "May"]---原数组改变,按顺序返回剩下的元素
(4)传入更多:表示从索引为 start 的数据开始删除,删除 num 个,并将第三个参数及后面所有参数,插入到 start 的位置
1)删除的数据,等于,添加的数据,数量相同。相当于把某几个数据替换了
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice(2, 2, "a", "b")); //["Lucy", "Lily"]--从索引为2开始删除2个,再把"a""b"插入删除的空隙
console.log(arr); //["Tom", "Jack", "a", "b", "May"]---原数组改变,相当于被替换了
2)删除的数据,多于,添加的数据。多的空位由后面的数据向前移补上
var arr = ["Tom", "Jack", "Lucy", "Lily", "May"];
console.log(arr.splice(2, 2, "a")); //["Lucy", "Lily"]--从索引为2开始删除2个,再把"a"插入删除的空隙,多的空隙,后面数据补上来。
console.log(arr); //["Tom", "Jack", "a", "May"]---原数组改变