目录
1.数组的概念
- 数组对象是使用单独的变量名来存储一系列的值。
- 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。
- 数组是一种将一组数据存储在单个变量名下的存储方式。
- 数组是引用数据类型,不是基本数据类型
- 数组与普通变量的区别
// 普通变量一次只能存储一个值
var num = 10;
// 数组一次可以存储多个值
var arr = [1,2,3,4,5];
2.数组的创建
2.1利用new创建数组
//先声明再赋值
var 数组名 = new Array();
//声明的同时赋值
var arr2=new Array(值,值,值,...);//如果()里面只有一项数据,表示数组的长度
var arr=new Array();//创建了一个新的空数组
var arr1=new Array(10);//创建了一个数组长度为10的空数组
2.2利用数组字面量创建数组
//1. 使用数组字面量方式创建空的数组(先声明再赋值)
var 数组名 = [];
//2. 使用数组字面量方式创建带初始值的数组(声明的同时赋值)
var 数组名 = ['小白','小黑','大黄','瑞奇'];
var arr=[];//创建一个空数组
var arr=[10];//创建一个里面有一个元素10的数组
2.3数组元素的类型
数组中可以存放任意类型的数据,例如字符串,数字,布尔值等
var arrStus = ['你好',12,true,28.9,undefined,'balala'];
3.数组的基本操作
3.1数组的索引
索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始)。
var arr = ['小白','小黑','大黄','瑞奇'];
索引号 0 1 2 3
3.2数组的获取
数组可以通过索引来访问(获取得到)、设置、修改对应的数组元素,我们可以通过“数组名[索引]”的形式来获取数组中的元素。
数组名 [索引号];
//定义数组
var arr=[1,2,3];
//获取指定元素
console.log(arr[1]);//2
3.3数组的增、删、改、查
- 增加数据
arr[索引号]=值;
- 索引号从0开始
- 可以不按顺序存储,没有数据的地方为空(empty)
- 在元素末尾添加数据****
arr[arr.length]=值;
arr.length的值永远比数组的最大索引号大1 *****
- 修改数据
arr[索引号]=新值;
多次存储同一个索引号位置的数据会覆盖,以最后一次存储的为准
- 查看数据
- 单个数据
arr[索引号];
var a=arr[索引号];
console.log(a);有数据输出数据,没有数据输出undefined
- 所有数据——遍历数组
- for...in
- for循环
- 单个数据
- 删除数据
- delete arr[索引号];(一般不用此方法)
- 只能清空元素内的数据,不能删除元素,数组长度不变
- 清除后输出元素,结果为undefined
- 内置方法
- 修改数组的长度
arr.length=值;
只能在数组的末尾增加或者删除元素
- delete arr[索引号];(一般不用此方法)
3.4遍历数组
- length
- 表示数据的长度(元素的个数)
- 索引号是从零开始的,长度表示数组中元素的个数
因此,数组中的最大索引号永远比长度小1 - 解决在元素末尾添加数据 arr[arr.length]=值
- 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]);//数组中的元素 }
4.数组排序
冒泡排序(冒泡算法):数组中的数据从小到大或从大到小进行排序
- 基本思路:双重循环
- 外层循环:控制轮数 arr.length-1轮
-
.内层循环 控制数据的比较次数 arr.length-当前轮数 相邻的元素比较大小,交换顺序
-
举例:把[5,4,3,2,1]从小到大排序
[5,4,3,2,1] 数组的长度 arr.length==5
外大轮 1轮
内层 4次
[4,5,3,2,1]
[4,3,5,2,1]
[4,3,2,5,1]
[4,3,2,1,5]
外大轮 2轮
内层 3次
[3,4,2,1,5]
[3,2,4,1,5]
[3,2,1,4,5]
外大轮 3轮
内层 2次
[2,3,1,4,5]
[2,1,3,4,5]
外大轮 4轮
内层 1次
[1,2,3,4,5]
- 代码实现
var arr=[5,4,3,2,1]; for(var i=1;i<=arr.length-1;i++){ for(var j=0;j<arr.length-i;j++){ if(arr[j]>arr[j+1]){ var temp; temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } console.log(arr);
5.检测数据类型
引用数据类型的检测用 instanceof
数组名 instanceof Array 返回值是true false
栈内存中存储引用地址,堆内存中存储数据。栈内存与堆内存存储的有对应的地址编号,有一根线把数据关联起来
6.浅拷贝与深拷贝
浅拷贝——把原数组直接赋值给新数组
- 拷贝的是引用地址,指向的是同一块数据
- 其中一个数组中的数据被修改,另一个数组被同步修改
var arr=[10,20];
var arr1=arr;
深拷贝
- 新建一个数组,通过遍历数组,把原数组中的元素复制到新数组
-
其中一个数组中的数据被修改,另外一个数组中的数据不会被修改,两个数组没有关系。
var arr=[10,15,'hello',true,56]; var newarr=[]; for(var i=0;i<arr.length;i++){ newarr[newarr.length]=arr[i]; } console.log(arr); console.log(newarr);
7.典型案例
-
录入班级成绩,当遇到‘exit’时结束录入,输出最高分和最低分
var arr=[]; while(true){ var score=prompt('请输入学生成绩'); if(score=='exit'){ break; } arr[arr.length]=+score; } for(var i=1;i<=arr.length-1;i++){ for(var j=0;j<arr.length-i;j++){ if(arr[j]>arr[j+1]){ var temp; temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } console.log(arr[0],arr[arr.length-1]);
-
查找数组元素第一次出现的位置,如果存在返回位置,不存在返回-1
var arr=[1,45,0,89,4,0,12]; var flag=1; for(var i=0;i<arr.length;i++){ if(arr[i]==0){ console.log(i); flag=0; break; } } if(flag==1){ console.log(-1); }