- 概念
- 数组是数据的有序列表
- 长度可以动态调整(通过length调整,或随着数据的增加删除改变)
- 每一项可以保存任何数据类型的数据
- 索引范围是0->length-1
- 改变原数组的方法有7个:push、pop、unshift、shift、reverse、sort、splice
- 创建数组
- var arr = new Array()
- var arr = []
- 检测数组
- arr instanceof Array
- Array.isArray(arr)
- join(分隔符字符串):
数组转字符串,用分隔符分隔数组的每一项,并组成字符串- 栈(先进后出)和队列(先进先出)方法:push、pop、unshift、shift
添加返回新数组的长度,删除返回删除的项,改变原数组
- push():尾添加,接收任意个参数,将每一个参数逐个添加到数组的尾部
- pop():尾删除,删除尾部的最后一项,不接收参数
- unshift():头添加
- shift():头删除
- 重排序方法:
改变原数组
- reverse():反转数组项的顺序
- sort(函数):
- 参数为一个函数:function(a,b){},第一个参数a为数组的第二项,第二个参数b为数组的第一项
- 数组每一项都调用toString(),比较的为调用toString()后返回的字符串
- 默认为升序(即小的在前)
- 升序:return a-b
- 降序:return b-a
- 例如:数组有两项,分别为:[1,2],升序时为:a-b = 2-1>0,所以升序:return a-b
- 例如:数组有两项,分别为:[1,2],降序时为:b-a = 1-2<0,两项交换位置,所以降序:return b-a
- sort原理:返回负数,ab两项交换位置;返回正数或0,ab两项位置不变;
- concat():连接数组,接收任意个参数,将参数逐个添加到当前数组的尾部,返回新数组,不改变原数组
- slice(start,end-1):截取数组
- 不改变原数组,返回新截取的数组
- 第二个参数不传为截取到尾部
- 参数为负数时加上数组的长度
- 开始位置大于结束位置返回空数组[]
- splice(开始位置,删除的个数,插入的项,插入的项n…):
删除或替换数组,返回删除项组成的数组,没有删除(第二个参数为0)返回空数组[]- indexOf()、lastIndexOf():
查找指定项的位置,不改变原数组,返回查找项的位置,没有找到返回-1,查找为全等查找
- indexOf(要查找的项,开始查找的位置):从前向后
- lastIndexOf(要查找的项,开始查找的位置):从后向前
- 遍历方法:forEach、map、filter、some、every
参数均为:要在数组每一项上运行的函数,运行该函数的作用域对象;第一个参数函数接收3个参数:function(数组当前项的值,数组当前项的索引,数组本身){}
- forEach():对数组中的每一项运行给定函数,没有返回值
- map():对数组中的每一项运行给定函数,返回调用函数的结果组成的数组
- filter():对数组中的每一项运行给定函数,返回调用函数后返回true的数组项组成的数组
- some():对数组中的每一项运行给定函数,调用函数的任意一项返回true,则返回true
- every():对数组中的每一项运行给定函数,调用函数的所有项返回true,则返回true
- find():对数组中的每一项运行给定函数,返回调用该函数后第一个返回true的数组项,没有返回undefined
- findIndex():对数组中的每一项运行给定函数,返回第一个为true的数组项的索引,没有返回-1
- 归并方法:reduce、reduceRight,迭代数组的所有项,构建一个最终的返回值
参数均为:在数组每一项上调用的函数,作为归并的初始值;第一个参数函数接收4个参数:function(数组前一项调用函数后返回的值,数组当前项的值,数组当前项的索引,数组本身){}
- reduce():从前向后
- reduceRight():从后向前
ES6新增
- 将指定参数转为数组:Array.from()、Array.of()、扩展运算符
- 数组实例的方法:copyWithin()、fill()、includes()、entries()、keys()、values()
- rest参数、扩展运算符(…):
- rest参数:多个参数序列转为数组
- 扩展运算符(…):
- 数组转为多个用逗号分隔的参数序列(把数组展开,),…后面可以跟数组、对象、表达式
…(x>0?[1,2]:[])
…[1,2,3]
- 扩展运算符背后调用的是遍历器接口(Symbol.iterator),没有部署该接口的对象不能使用扩展运算符
- 扩展运算符用途:
函数调用:([].push(…[1,2,3]),push()参数为数组时会当成一项放到调用的数组中,使用扩展运算符后,会当成3项)
函数返回值
与解构赋值结合
合并数组(concat、apply、扩展运算符)
字符串转数组
将有Iterator接口的对象转为真正的数组
- 例子:
- 扩展运算符:加[]与解构赋值结合
[…‘aaa’] //[‘a’,‘a’,‘a’]
…‘aaa’ //a,a,a
[…[1,2,3]] //[1,2,3]
…[1,2,3] //1,2,3
- rest参数:
function test(…arr){console.log(arr)}
test(1,2,3) //[1,2,3]
- Array.from():将指定参数转化为数组
- 将可遍历对象(有Iterator接口的对象)和类数组对象(有length属性的对象)转为数组
- 扩展运算符只能讲可遍历对象转为数组
- 有Iterator的对象:字符串、数组、arguments、DOM操作返回的NodeList对象、Set、Map,他们可以使用for…of、扩展运算符、generator
- Array.from(obj,fn,执行函数的作用域对象this):接收3个参数,加上第2,3个参数功能类似map方法
Array.from(obj,fn)=>Array.from(obj).map(fn)
- Array.of():
- 接收任意个参数,返回每个参数值组成的数组,无参数返回空数组[]
- 实现方法:
function test(){return [].slice.call(arguments)}- 例子:
Array.of() //[]
Array.of(1) //[1]
Array.of(1,2) //[1,2]
Array.of(undefined) //[undefined]
- 实例方法:copyWithin()
- 将当前数组指定位置的数组项复制到其他位置(会覆盖原有位置的数组项),改变原数组
- 接收3个参数:开始替换的位置(必填),开始读取的位置(默认为0,负值要倒数,倒数从1开始),结束读取的位置(默认为数组的长度,负数倒数)
- [1,2,3,4,5].copyWithin(0,-2,-1) //[4,2,3,4,5],-2相当于3号位即数组项4,-1相当于4号位即数组项5
- 实例方法:find()、findIndex()
- find(fn,执行函数时的作用域对象this):所有数组项依次调用指定函数,返回调用该函数后第一个返回true的数组项,没有返回undefined
- findIndex():同find,返回第一个为true的数组项的索引,没有返回-1
- 实例方法:fill()
- 用给定的值填充数组,数组中已有的会被覆盖
- 接收3个参数:用于填充的值,填充开始的位置,填充结束的位置
- 实例方法:entries()、keys()、values()
- 遍历数组,返回一个遍历器对象,用于for…of循环
- 三者区别
entries():遍历键值对
keys():遍历键名
values():遍历键值
- 实例方法:includes()
- 返回布尔值,判断数组中是否包含给定的值,与字符串的includes类似
- 接收2个参数:查找的值,查找开始的位置(默认为0,负数时为倒数(从1开始),大于数组长度是位0)
- 数组的空位
- 空位指数组的某个位置没有任何值(不是undefined)
Array(3) //[,]- ES5处理空位表现不一致
forEach、filter、some、every:跳过空位
map:跳过空位,但会保留这个值
join、toString:将空位视为undefined,而undefined和null会被处理为空字符串‘’- ES6:都将空位转为undefined