JS数组

183 阅读3分钟

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()函数接受一个或者两个参数,如果有第二个参数,第二个参数是一个函数,第一个参数数组中的每一个值都会经过该函数的处理再返回。

image.png

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这种。

image.png 二、Map

Map()方法用于对每个元素进行处理并将处理结果返回给该元素。Map()返回一个新数组,并不修改调用它的数组。forEach可以修改调用它的数组。

image.png

三、Filter

可以接受三个参数

image.png 过滤稀疏数组,只保留有值的元素

A.filter(()=>true)

image.png 清空空隙删除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

image.png 五、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