6. 数组
JS数组中的不同元素可以是不同的类型;也可以是对象或者数组;数组可以是稀疏的,即不一定具有连续的索引。
数组从Array.prototype继承属性。
ES6新增定型数组。
6.1 创建数组
6.1.1 数组字面量
let count = [1,,3]; 索引1没有数值,按索引访问时返回undefined
let undefs = [,,]; 该数组没有元素,长度为2,数组字面量语法允许末尾出现逗号
6.1.2 扩展操作符
let a = [1,2,3];
let b = [0,...a,4]; b的值为0,1,2,3,4
数组去重的方法:将数组转为set去重后再转回来
let letters = [...”hello world”];
[...new Set(letters)] 结果为[‘h’,’e’,’l’,’o’,’’,’w’,’r’,’d’]
6.1.3 Array()构造函数
let a = Array(10); 创建一个长度为10的数组,数组没有存储任何值,数组索引“0”、“1”等没有意义。
传入Array()构造函数的参数个数大于1时,参数代表数组元素。
所以使用Array()构造函数无法创建一个只含有一个特定值的数组。
6.1.4 Array.of()函数
使用Array.of()可以创建一个含有特定值的元素。
Array.of(10) 创建一个只含有元素10的数组
Array.of(1,2,3) 创建一个含有元素1,2,3的数组
6.1.5 Array.from()函数
Array.from()用于创建数组的副本。
Array.from()函数接受一个或者两个参数,如果有第二个参数,第二个参数是一个函数,第一个参数数组中的每一个值都会经过该函数的处理再返回。
4.1 可读写数组元素****
数组是对象,索引可以使用字符串等,但是只有所以为数值0-2^32-2之间才会为数组添加长度length属性。
查询对象中不存在的属性会返回undefined。
6.2 稀疏数组
稀疏数组的判定:length值大于元素个数
方法一: let a = Array(5) 创建了一个长度为5但是没有元素的数组
方法二:****
方法三:****
let a = [,];
方法四:****
let b = [undefined,undefined];
6.3 数组长度
如果将数组长度强行设置为小于数组元素个数的值,数组中length之后的值会被删除
4.4 添加或删除数组元素
尾部添加:a.push
首部添加:a.unshift
删除:delete a[2] 删除元素相当于把数组该索引处值设为undefined,不会改变数组长度,会使数组变为稀疏数组
4.5 数组迭代
for/of:不能感知稀疏数组 如果想得到数组索引,使用for(let[index,item] of a.entries())
forEach:可以感知稀疏数组
4.6 多维数组
访问元素a[x][y]
4.7 数组方法
6.8.1数组迭代器方法
这类方法对于稀疏数组,不会对不存在的数组元素调用传入的这个参数。
一、forEach
参数是一个函数,可以接收三个参数,第一个参数是元素值,第二个参数是元素索引,第三个参数是数组对象,第二、三个参数可以省略。forEach没有提前终止的方式,类似break这种。
二、Map
Map()方法用于对每个元素进行处理并将处理结果返回给该元素。Map()返回一个新数组,并不修改调用它的数组。forEach可以修改调用它的数组。
三、Filter
可以接受三个参数
过滤稀疏数组,只保留有值的元素
A.filter(()=>true)
清空空隙删除Undefined和null
A. filter(x=>x!=null&&x!=undefined)
四、every和some
均返回true或者false
A. every(x=>x>0) 在第一次返回false时就停止返回false
A. some(x=>x>0) 在第一次返回true时就停止返回true
对于空数组,every返回true;some返回false
五、find和findIndex
find返回第一个匹配的元素,没找到返回undefined;findIndex返回第一个匹配的元素的索引,没找到返回-1
六、reduce和reduceRight
reduce:归并,接收两个参数,第二个参数表示传给归并函数的初始值;reduceRight从高索引开始归并
let a = [1,2,3,4,5];
a.reduce((x,y)=>x+y,0) //15
a.reduce((x,y)=>x*y,1) //120
a.reduce((x,y)=>x>y?x,y) //5