目录
六、数组
1.数组的概念
- 数组是指一组数据的集合,其中的每个数据被称为元素,在数组中可以存放任意类型的元素
- 数组是一种将一组数据存储在单个变量名下的存储方式
- 数组属于引用类型
//普通变量一次只能存储一个值 var num=10; //数组一次可以存储多个值 var arr=[1,2,3,4,5];
2.数组的创建
2.1 JS创建数组的方式
- 利用new创建数组
- 利用数组字面量创建数组
2.2 利用new创建数组
var 数组名=new Array();
var arr=new Array(); //创建一个新的空数组
2.3 利用数组字面量创建数组
//1.使用数组字面量方式创建空的数组
var 数组名=[];
//2.使用数组字面量方式创建带初始值的数组
var 数组名=['小白','小陈','小王','小张'];
- 数组名的字面量是方括号
- 声明数组并赋值称为数组的初始化
- 这种字面量方式是使用最多的方式
3. 获取数组中的元素
3.1 数组的索引
var arr=['小白','小陈','小王','小张'];
//索引号 0 1 2 3
//数组元素arr[0] arr[1] arr[2] arr[3]
- 索引(下标)是用来访问数组元素的序号
- 索引号从0开始,可以不按顺序存
3.2 向数组中添加元素
- 数组可以通过索引来访问、设置、修改对应的数组元素,我们可以通过“数组名[索引]”的形式来获取数组中的元素。
- 通过修改length长度新增数组元素
//可以通过修改length的长度来实现数组扩容的目的 //length属性是可读写的 var arr=[11,22,33,44]; arr.length=5; arr[4]=55; console.log(arr); //[11,22,33,44,55]
- 通过修改数组索引新增数组元素
//可以通过修改数组索引的方式追加数组元素 //不能直接给数组名赋值,否则会覆盖掉以前的数据 var arr=[1,2,3,4]; arr[4]=100; console.log(arr); //[1,2,3,4,100]
- 如何实现永远在数组的末尾添加元素:arr[arr.length]=末尾元素;
var arr1=[1,2,3,4]; arr1[arr1.length]=5; console.log(arr1); //[1,2,3,4,5]
3.3 删除数组元素
- delete arr[索引号] 只能清空元素,数据长度不变(一般不用)
- 使用arr.length修改数组长度,但只能从末尾删除元素。
3.4 修改数组元素
arr[索引号]=新值; 以最后一次存的为准
var arr=[1,2,3];
arr[2]=4;
console.log(arr); //[1,2,4]
3.5 查看数组元素
var ele=arr[索引号];
console.log(ele);
- 若该位置没有存数,取出来是undefined
- 使用for...in遍历,没有存数的位置,直接不输出;
var arr=['a','b','c',,'e']; console.log(arr[1]); //b console.log(arr[3]); //undefined
4. 获取数组长度(元素个数)
使用“数组名.length ”可以访问数组元素的数量(数组长度)
- 因为索引号是从0开始的,所以数组中最大的索引号,永远比arr.length长度小1;
- 当数组中元素个数发生了变化,这个length属性也跟着变化;
- 常用于遍历数组中的所有项---数组名.length;
var arr=[1,2,3,4]; console.log(arr.length); //4
5. 遍历数组
遍历:就是把数组中的每个元素从头到尾都访问一次。
循环方式 | 案例 | 区别 |
for循环 | for(var i=0;i<arr.length;i++){ console.log(i); //索引号 console.log(arr[i]); //数组中的元素 } |
|
for...in循环 | for(var k in arr){ console.log(k); //索引号 console.log(arr[k]); //数组中的元素 } |
|
6. 检测数据类型的方法
6.1 为什么说数组是引用类型?
- 栈内存:存的是引用地址
- 堆内存:存的是数据(也会有地址编号)
- 引用地址:和堆中的地址编号一致,通过一条引线关联起来。(arr=null相等于引线被剪断了)
6.2 检测引用类型
使用运算符 instanceof来检测数组的引用类型
数组名 instanceof Array
返回值是true和false
var arr=[];
console.log(arr instanceof Array); //true
var arr1='';
console.log(arr1 instanceof Array); //false
6.3 深拷贝和浅拷贝
- 浅拷贝:指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
var arr=[10,20,30]; var newarr=arr; arr[0]='good'; //修改一个数组中的元素 console.log(arr,newarr); //['good',20,30] ['good',20,30] //两个数组中数据同步修改
浅拷贝:新建的一个数组,把原数组直接赋值给新数组,拷贝的引用地址,指向的是同一块内存中数据,其中一个数组中的数据被修改,另一个数组同步修改。
2.深拷贝:重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。
var arr=[10,20,30];
var newarr=[];
for(var i=0;i<arr.length;i++){
newarr[newarr.length]=arr[i];
}
console.log(newarr); //[10,20,30]
newarr[newarr.length]='end';
console.log(newarr); //[10,20,30,'end']
console.log(arr); //[10,20,30]
深拷贝:新建的一个数组,把原数组遍历一下,通过递归方式,把原数组中的元素复制一份到新数组,修改原数组或新数组,两个数组的值不会同步修改,两个数组之间没有关系。
深拷贝 |
|
浅拷贝 |
|
7. 冒泡排序
-
冒泡排序:是一种算法,把一系列的数据按照一定的顺序进行排列显示(从小到大或从大到小)。
-
原理:在冒泡排序的过程中,按照从小到大排序或从大到小排序,不断比较数组中相邻两个元素的值,较小或较大的元素前移(交换数据)
- 思路:双重循环
外层循环 比较的轮数 arr.length-1 内层循环 相邻两个数比较的次数 arr.length-1-i var arr=[5,4,3,2,1]; for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } console.log(arr);//[1,2,3,4,5]
8. 二维或多维数组
var arr=[ [],[],[] ]; 二维数组
var arr=[ [ [],[] ],[] ]; 多维数组
//对二维数组求和
var arr=[[10,20],[50,60],[70,80]];
var sum=0;
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
sum+=arr[i][j];
}
}
console.log(sum);