一、数组的概念
- Array数组是数据的有序列表;
- 数组中的每一个值叫做元素。每一个元素都有自己的位置,这个位置叫做索引。索引是从0开始的;
- ECMAScript数组是没有类型的;
- ECMAScript同一个数组中可以存储不同类型的数据;
- ECMAScript语言中数组的长度是可以动态变化的;
- Array是ECMAScript中常用的引用类型之一;
二、数组的创建
1.字面量法
var arr = [];//创建一个空数组var arr2 = [1,"abc",true,3.14];
2.构造函数法创建数组
var arr3 = Array();//创建了一个空数组console.log("arr3 "+arr3.length);var arr4 = new Array(20);//创建了一个容量为20的数组console.log("arr4 "+arr4.length);var arr5 = new Array(1,2,3,4);//创建了一个容量为4的数组console.log("arr5 "+arr5.length);
三、数组元素的读写--索引法
数组的索引是从0开始,也就是说索引0代表第一个元素。
1.读取元素
var arr = [1,'abcd',true,20.5,'123'];var a1 = arr[1];console.log(a1);//提取数组第一个元素console.log(arr[arr.length - 1]);//提取数组最后一个元素//数组越界console.log(arr[5]);//undefined//打印数组中每一个元素//数组的遍历for (var i = 0; i < arr.length; i++) { console.log(arr[i]);}
注:当使用索引访问不存在的元素的时候,称之为数组越界,值为undefined
2.修改元素
var arr = [1,'abcd',true,20.5,'123'];//修改数组的某个元素arr[0] = 10;arr[1] = 20;console.log(arr);
3.添加元素
var arr1 = [];//向数组中添加元素arr1[0] = 'abc';console.log(arr1);arr[5] = 'hello';console.log(arr);var arr2 = [];//循环向数组中添加元素for (var i = 0; i < 100; i++) { arr2[i] = i+1;}console.log(arr2);
注:数组中没有这个元素就是添加,有就是修改
四、获取数组的长度
数组的length属性非常有特点:他不是只读的。可以通过数组的length属性向数组的末尾扩大数组的容量,或者从数组末尾移除数组元素。
var arr = [1,2,3,4,5,6,7,8,9,10];//1.获取数组的长度console.log("数组的长度"+arr.length);//2.js的数组,可以通过修改length的值,来修改数组的容量arr.length = 8;console.log(arr);arr.length = 20;console.log(arr);
五、数组常用的方法
1、arr.push(v1,v2...) 描述:向数组末尾添加一个或者多个数组元素 参数:需要添加的数组元素 返回值:数组的长度 注意:原数组改变
var arr = [1,2,3,4,5];console.log( arr.push("abc",11,22,33) );//9console.log(arr);//[1, 2, 3, 4, 5, "abc", 11, 22, 33]
2、arr.pop() 描述:从数组的末尾删除一个数组元素 返回值:返回删除的元素 注意:原数组改变
console.log(arr.pop() );//9console.log(arr);//[1, 2, 3, 4, 5, "abc", 11, 22]
3、arr.unshift(v1,v2...) 描述:向数组的头部插入元素 参数:需要插入的值 返回值:数组的长度 注意:原数组改变
arr.unshift(100,200,300);console.log(arr);//[100, 200, 300,1, 2, 3, 4, 5, "abc", 11, 22]
4、arr.shift() 描述:删除数组的第一个元素 参数:删除掉的元素 注意:原数组改变
arr.shift() console.log(arr);//[200, 300,1, 2, 3, 4, 5, "abc", 11, 22]
5、arr.join("+") 描述:将数组的值连接成字符串 参数:字符串 返回值:拼接成的字符串
console.log(arr.join('*'));//200*300*1*2*3*4*5*abc*11*22
6、arr.reverse() 描述:将数组的数组元素倒置 返回值:返回原来的数组 注意:元数组改变
console.log( arr.reverse() );//[22, 11, "abc", 5, 4, 3, 2, 1, 300, 200]
7、arr.concat(v1,v2,v3...) 描述:创建一个新数组,新数组的元素是arr数组的全部元素,再加上参数中的元素 参数:可以使数组元素,也可以使数组 返回值:新数组
console.log( arr.concat(true,false,["aa","bb"]) );console.log(arr);//[22, 11, "abc", 5, 4, 3, 2, 1, 300, 200, true, false, "aa", "bb"]
8、arr.slice(start,end) 描述:返回数组中一部分 参数:开始的位置,结束的位置 返回值:数组的一部分 注意:start的值必须大于1并且不能小于end的值
console.log( arr.slice(0,58) );console.log(arr);//[22, 11, "abc", 5, 4, 3, 2, 1, 300, 200]
9、arr.splice(index,howmany,v1,v2...) 描述:向数组中添加元素或者从数组中删除元素 参数:index--必需,规定添加或者删除元素的地方。赋值表示从数组末尾开始 howmany--必需,要删除项目的个数,如果值为0,则不会删除元素 v1--可选,向数组中添加新的项目 返回值:改变之后的数组
var arr2 = [0.1,0.2,0.3];//1.向0.2之前添加一个0.05arr2.splice(1,0,0.05);console.log(arr2);//[0.1, 0.05, 0.2, 0.3]//2.删除掉0.05arr2.splice(1,1,"abc","abd","cbd");console.log(arr2);//[0.1, "abc", "abd", "cbd", 0.2, 0.3]//3.删除多个数组元素arr2.splice(1,3);console.log(arr2);//[0.1, 0.2, 0.3]
10、indexOf(v1) 描述:从数组头部查找v1,找到的话返回索引 参数:要查找的数值 返回值:索引,没有找到返回-1
var arr3 = [100,200,200,300,200,400,500,100,200];console.log( arr3.indexOf(200));//1
11、lastIndexOf(v2) 描述:从数组尾部查找v1,找到的话返回索引 参数:要查找的数值 返回值:索引,没有找到返回-1
var arr3 = [100,200,200,300,200,400,500,100,200];console.log( arr3.lastIndexOf(200) );//8
六、排序
冒泡排序 (Bubble Sort)
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一轮,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
//数组中有10个元素都是数字,从小到大排序 var arr = [2,4,3,6,1]; /* 选择排序: 每一个元素和后面所有的元素比较,把最小的放在前面 * 原数组:2 4 3 6 1 * 第一层循环: 遍历数组 * 第一次:arr[0] = 2 * 第二层循环: * 第一次:2 4 ---- 不动 * 第二次:2 3 ---- 不动 * 第三次:2 6 ----- 不动 * 第四次:2 1 ----- 2 和1交换位置 1 4 3 6 2 * 第二次:arr[1] = 4 * 第二层循环: * 第一次:4 3 --- 4 和3交换位置 1 3 4 6 2 * 第二次:3 6 ---- 不动 * 第三次:3 2 ---- 3和2交换位置 1 2 4 6 3 * * 第三次:arr[2] = 4 * 第二层循环: * 第一次:4 6 ---- 不动 * 第二次:4 3 ---- 4和3交换位置 1 2 3 6 4 * 第四次:arr[3] = 6 * 第二层循环: * 第一次:6 4 --- 6和4交换位置 1 2 3 4 6 * * */ //第一层循环 for (var i = 0; i < arr.length - 1; i++) { //第二层循环 for (var j = i + 1; j < arr.length; j++) { //1 --- 5 //当前第一层循环的元素arr[i]和后面的每一个元素比较 if(arr[i] > arr[j]){ //如果比后面的值大,交换两个元素的值,小值在前面 var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } }