一、 简介
数组就是用来存储一组数据的
- 声明一个变量就是在内存空间划出一块合适的空间
- 声明一个数组就是在内存空间划出一串连续的空间
数组的三要素:
- 数组名称:用于区分不同的数组
- 数组元素:向数组中存放的数据
- 元素下标:数组元素的编号,也称为索引,从0开始,通过下标来访问数组元素
二、基本用法
1、步骤:
1.创建数组
var 数组名=new Array();
2.为数组元素赋值
数组名[索引]=元素值;
3.获取元素值
数组名[索引]
//1.定义数组
var array=new Array();//其实数组也是一个变量,只不过可以存储多个数据
//2.向数组中添加元素
array[0]="tom";
array[1]="jack";
array[2]="lily";
array[3]=12;
array[4]=true;//可以添加任意类型的数据
//3.获取数组元素
console.log(array[0]);
console.log(array[3]);
console.log(array[4]);
console.log(array[5]);//获取不存在的元素时返会undefined
//直接输出数组
console.log(array);//所有元素以逗号分隔,包围为中括号里
2、数组属性
length属性,用法:数组名.length
数组的 length
属性返回它的元素的个数。也可修改数组长度
var array=new Array();
array[0]="tom";
array[1]="jack";
array[2]="lily";
array[3]=12;
array[4]=true;
console.log(array);
console.log(array.length);
array[5]="180.5";
console.log(array.length);//当数组中元素数量发生变化时,length属性的值也会变化
//修改数组的长度,即只保留指定数量的元素
array.length=2;
console.log(array);
因为数组索引是从0开始的,所以 length 属性总是比最高的数组索引大1。如果数组为空则length属性的值为0
三、循环数组
var array=new Array();
array[0]="tom";
array[1]="jack";
array[2]="lily";
array[3]=12;
array[4]=true;
console.log(array);
//循环数组,三种方式
for(var i=0;i<array.length;i++){
console.log(i,array[i]);
}
for(var index in array){
console.log(index,array[index]);
}
for(var item of array){
console.log(item);
}
四、定义数组的方式
两种方式:
- 使用
new Array()
var array=new Array(); // 创建一个空数组,长度为0
var array=new Array(4); // 创建一个长度为4的数组(只填一个数字)
var array=new Array("apple", "orange", "peach", "bananer"); // 创建一个包含初始元素的数组
array[0]="grape"//修改元素的值
array[array.length]=88;//向数组的末尾添加元素
- 使用数组字面量
[]
var names=[ ]; // 创建一个空数组
var names= ["apple", "orange", "peach", "bananer"]; // 创建一个包含初始元素的数组
names[0]="grape"//修改元素的值
names[names.length]=88;//向数组的末尾添加元素
五、字符串索引数组
默认情况下,会使用数字作为数组索引,也可以使用字符串作为数组索引,称为字符串索引数组
- 字符串索引一般称为key键,对应的元素称为value值
- key不会对length属性产生影响,所以不适合使用普通for循环,而应该使用for…in或for...of循环
var arr=[21,66,88,99];
arr[4]=77;
arr["name"]="jack";
arr["sex"]="female";
arr["age"]=23;
console.log(arr);
console.log(arr["age"]);
console.log(arr["sex"]);
console.log(arr.length);//length属性无法获取字符串索引的元素
//for...in遍历数组中所有元素
for(var i in arr ){
console.log(i,arr[i]);
}
六、数组常用方法
方法名 | 含义 |
---|---|
reverse() | 将数组元素倒序排列 |
indexOf() | 返回指定元素在数组中第一次出现的位置 |
lastIndexOf() | 返回指定元素在数组中最后一次出现的位置 |
join() | 将数组拼接为string |
concat() | 将多个数组拼接成一个数组 |
push() | 向数组末尾添加一个或多个元素,并返回新的长度 |
pop() | 删除并返回数组的最后一个元素 |
unshift() | 向数组开头添加一个或多个元素,并返回新的长度 |
shift() | 删除并返回数组的第一个元素 |
slice() | 返回数组中指定范围内的元素 |
splice() | 删除元素,并在删除位置添加新的元素,然后返回被删除的元素 |
toString() | 将数组转换为字符串 |
valueOf() | 返回数组对象本身,一般会自动调用 |
sort() | 排序,默认按字符编码的顺序排列,非string类型会自动转换为string,也可以自定义比较规则 |
forEach() | 遍历数组中的每个元素 |
示例:
//用法:数组名.方法名(参数)
var names1=["tom","jack","alice","mike","jack","lucy"];
console.log(names1);
//1.reverse()反转
names1.reverse();
console.log(names1);
//2.indexOf()查询指定元素第一次出现的位置
var names2=["tom","jack","alice","mike","jack","lucy"];
console.log(names2.indexOf("jack"));//如果重复只显示第一次出现的位置
console.log(names2.indexOf("jack",2));//从索引为2的位置开始查找
console.log(names2.indexOf("apple"));//如果不存在,则返回-1
//3.lastIndexOf()查询指定元素最后一次出现的位置
var names3=["tom","jack","alice","mike","jack","lucy"];
console.log(names3.lastIndexOf("jack"));
//4.join()拼接为字符串
var names4=["tom","jack","alice","mike","jack","lucy"];
console.log(names4.join());//默认使用,逗号拼接
console.log(names4.join("-"));//指定要分隔的字符
//5.concat()将多个数组拼接成一个数组
var names5=["tom","jack","alice","mike","jack","lucy"];
var hobbies=["eat","sleep"];
names5=names5.concat(hobbies);
console.log(names5);
//6.push()向数组末尾添加新的元素,并返回新的长度
var names6=["tom","jack","alice","mike","jack","lucy"];
names6.push("yang");//等价于names6[names6.length]="yang"
console.log(names6);
//7.pop()删除并返回数组末尾的元素
var names7=["tom","jack","alice","mike","jack","lucy"];
console.log(names7.pop());
//8.unshift()向数组开头添加新的元素,返回新的数组长度
var names8=["tom","jack","alice","mike","jack","lucy"];
names8.unshift("aa","bb");
console.log(names8);
//9.shift删除并返回数组开头的元素
var names9=["tom","jack","alice","mike","jack","lucy"];
console.log(names9.shift());
//10.slice()获取指定索引范围内的元素
var names10=["tom","jack","alice","mike","jack","lucy"];
console.log(names10.slice(2,4));//获取索引为[2,4)之间的元素,左闭右开
console.log(names10.slice(2));//如果省略第二个参数,表示获取到数组末尾
//11.splice()从指定索引位置删除指定个数的元素,并在此位置添加新的元素
var names11=["tom","jack","alice","mike","jack","lucy"];
// names11.splice(2,3);//从索引为2的位置开始删除,删除3个
console.log(names11.splice(2,3));//返回被删除的元素
names11.splice(2,3,"aa","bb");//在删除的位置添加元素
console.log(names11);
//12.toString()将数组转化为字符串
var names12=["tom","jack","alice","mike","jack","lucy"];
var str=names12.toString();//等价于names12.join()
console.log(str);
//13.valueOf()
var names13=["tom","jack","alice","mike","jack","lucy"];
console.log(names13.valueOf());
console.log(names13);//自动调用valueOf()
//14.sort()排序,默认按字符编码ASCII的顺序排列
var names14=["tom","jack","alice","mike","jack","lucy"];
names14.sort();
console.log(names14);
var nums=[12,24,21,65,3,27,77];
nums.sort();//默认会将数字转换为字符串,然后根据字符编码进行排序
console.log(nums);
//15.forEach()遍历数组
var names15=["tom","jack","alice","mike","jack","lucy"];
names15.forEach(function(value,index){//value表示数组元素,index表示元素索引
console.log(value,index);
});
执行结果:
七、二维数组
二维数组可以认为是特殊的一维数组:
- 一维数组中的每个元素又是一个一维数组
- 即数组中的元素也是数组
示例:
//二维数组
var names=[
["aa","bb","cc"],
["11","22","33","44"],
["a1","a2"]
];
console.log(names[1][2]);
//使用二重循环遍历输出
for(var i=0;i<names.length;i++){
for(var j=0;j<names[i].length;j++){
document.write(names[i][j]+" ");
}
document.write("<br>");
}
//循环生成二维数组
var array=[];
//循环生成四行
for(var i=0;i<4;i++){
array[i]=[];
//循环生成四列,并为每列生成一个随机数
for(var j=0;j<4;j++){
array[i][j]=parseInt(Math.random()*99+1);
}
}
console.log(array);
执行结果:
八、冒泡排序
冒泡排序是一种比较简单的排序算法
- 比较相邻的元素,如果第一个比第二个大,交换它们两个(升序)
- 比较相邻的元素,如果第一个比第二个小,交换它们两个(降序)
- 针对所有元素重复以上的步骤,直到没有任何一对数字需要比较
结论:
- 如果有n个元素,则需要比较n-1轮
- 每一轮比较n-m次,m表示第几轮
var nums=[12,4,25,7,49,23,150,2];
console.log(nums);
//外层循环控制比较的轮数,每一轮确定一个数字
for(var i=0;i<nums.length-1;i++){//比较n-1轮(n在这儿为nums.length)
//内层循环控制每轮比较的次数
for(var j=0;j<nums.length-i+1;j++){//比较n-m次,m表示第几轮(m在这儿为i+1,因为i从0开始)
//升序
if(nums[j]>nums[j+1]){
var temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
console.log("第"+(i+1)+"轮:"+nums);
}
console.log(nums);