三、数组
创建数组
一个标识符可以存储多个数据,并且数据的类型可以不同。
1、字面量
let account1 = ["F72", "123", 2000, false];
中括号里每个数据之间的分隔符为逗号,每个数据成为元素,每个元素都有自己在数组中的唯一索引(下标),我们可以通过索引(下标)来获取数据。下标起始值为0
访问一个不存在的下标输出值为undefined
2、构造函数
let arr = new Array();
3、区别
字面量创建的数组解析速度更快
原因:字面量属于JSON格式,JS引擎可以直接解析;构造函数需要先调用构造函数,再进行JS引擎的解析
数组的遍历
let arr = ["F72", "123", 2000, false];
for(let i=0;i<4;i++){
console.log(arr[i]);
}
for of 遍历数组中的每个值
for in 遍历数组中的每个下标
ex//for of 遍历数组中的每个值
for(let items of arr){
console.log(items);
}
//for in 遍历数组中的每个下标
for(let index in arr){
console.log(index);
}
数组的属性
获取数组的长度(数据个数):数据名.length
数组的方法
1、查找
indexOf();
从第一个值开始向后查找,返回第一个与查找内容相等数据的下标,如没找到返回-1;
lastIndexOf();
从最后一个值往前查找,返回第一个与查找内容相等数据的下标,如没找到返回-1;
二维数组
let data = [
['123', '123', 500],
['456', '456', 1000]
];
console.log(data[0][2]);
返回数组中查找的数据是否存在
.includes()
返回true和false
栈、堆
【常量const的扩展】
如果赋值给常量的是基本数据类型,则常量存储该基本数据类型变量具体的值。
如果赋值给常量的是引用数据类型,则常量存储该引用数据类型变量的地址。
注:引用数据类型存储的值发生变化时,常量也会发生变化。
栈:基本数据类型存值,引用数据类型存地址(来自堆);
堆:引用数据类型存值(生成一个地址)
let i=[1,2];
let j=i;
i=[3,4];
console.log(i);//[3,4]
console.log(j);//[1,2]
let i=[1,2];
let j=i;
i[0]=3;
i[1]=4;
console.log(i);//[3,4]
console.log(j);//[3,4]
const a = [1, 2];
a[0] = 2;
console.log(a); //[2,2]
const b=1;
b=2;
console.log(b);//报错
2、新增
数组名.push()
在数组最后添加数据,可以添加多个值,用逗号分隔,返回值是(常用)
数组名.unshift()
在数组的开始添加数据,可以添加多个值,用逗号分隔
3、删除
数组名.pop()
删除数组最后一个数据,在括号里添加内容无效,仍然删除最后一个数据
数组名.shift()
删除数组第一个数据,在括号里添加内容无效,仍然删除第一个数据
delete 数组名[下标];
删除后会留下位置(不常用)
4、截取数据
-
数组名.slice()
不会改变原数组;返回参数对应的数据;一个参数: 获取数组数据的起始下标,返回从起始下标到数组最后一个数据。
两个参数:参数1:获取数组的起始下标;参数2:获取数组的结束下标。
功能:返回参数1到参数2的数据。(不包含参数2下标的数据)
注:
1、如果出现负值,则数组长度与其相加再进行截取
2、如果下标的数据不存在,则返回空数组,即[]
let F72 = ["A", "B", "C", true, false]; let F73 = F72.slice(1); console.log(F72); //["A", "B", "C",true,false]; console.log(F73); //["B", "C",true,false]; F73 = F72.slice(1, 3); console.log(F72); //["A", "B", "C",true,false]; console.log(F73); //["B", "C"]; F73 = F72.slice(-2, -1); console.log(F72); //["A", "B", "C",true,false]; console.log(F73); //[true]
-
数组名.splice()
会改变原数组,返回参数对应的数据(删除就返回删除的值,修改返回修改后的值,插入返回空数组);一个参数:把原数组截掉从该下标开始到最后的所有数据**(删除)**
两个参数:参数1:起始下标;参数2:截取个数**(删除)**
n个参数:参数1:起始下标;参数2:截取个数;参数3-n:修改添加的数据**(修改)**
当参数2为0时,相当于在参数1下标之前插入数据**(插入)**
**注:**括号里没有满足条件的内容,会返回[]
//删除 let F72 = ["A", "B", "C", true, false]; let F73 = F72.splice(3); console.log(F72); //[ 'A', 'B', 'C' ] console.log(F73); //[ true, false ] //删除 F72 = ["A", "B", "C", true, false]; F73 = F72.splice(3, 1); console.log(F72); //[ 'A', 'B', 'C', false ] console.log(F73); //[ true ] //修改 F72 = ["A", "B", "C", true, false]; F73 = F72.splice(1, 2, 1); console.log(F72); //[ 'A', 1, true, false ] console.log(F73); //[ 'B', 'C' ] //插入 F72 = ["A", "B", "C", true, false]; F73 = F72.splice(1, 0, 1); console.log(F72); //["A", 1, "B", "C", true, false]; console.log(F73); //[]
5、转换
字符串转数组:字符串名.split('分隔符')
let str ='123abc';
let arr=str.split('');
console.log(arr);//[ '1', '2', '3', 'a', 'b', 'c' ]
数组转字符串:数组名.join('分隔符')
let arr=[2020,1,2];
let str=arr.join('-');
console.log(str);//2020-1-2
6、拼接
数组1.concat(数组2)
不改变原数组
let arr1=[1,2,3];
let arr2=['a','b','c'];
let arr3=arr2.concat(arr1);//不改变原数组
console.log(arr3);//[ 'a', 'b', 'c', 1, 2, 3 ]
let arr1=[1,2,3];
let arr2=['a','b','c'];
arr2.push(...arr1);//改变原数组
console.log(arr2);//[ 'a', 'b', 'c', 1, 2, 3 ]
数组去重
let arr = [1, 2, 2, 2, 3, 3,4, 3, 5, 5, 3];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) != arr.lastIndexOf(arr[i])) {
arr.splice(arr.lastIndexOf(arr[i]), 1);
i--;//返回到当前下标再进行比较,直到没有重复的数据
}
}
console.log(arr);
快速清空数组
let arr = ["A", "B", "C", true, false];
arr.splice(0);
arr = [];
arr.length = 0;
[补充]运算符
-
解构运算符
赋值符号左右的数据类型(括号类型)要一致
//交换两个变量的值 let i = 1; let j = 2; [i, j] = [j, i] console.log(i, j); //2,1 //批量赋值 let [a,b,c]=[1,'a',3]; console.log(a,b,c);//1 a 3 let arr = ["A", "B", "C", true, false]; let [x,y]=arr; console.log(x,y);//A B let arr1=[1,2]; let [e,f,g,h]=arr1; console.log(e,f,g,h);//1 2 undefined undefined
-
扩展运算符(…)
let str ='123'; let arr1=['a','b','c']; let arr2=[...str]; console.log(arr2);//[ '1', '2', '3' ] console.log(...str);//1 2 3 console.log(...arr1);//a b c