一、定义
数组是一组连续的变量组成的集合--统一起一个名字 批量管理多个数据(js的存储都是数组)
二、创建
1 //创建的四种方式 2 //1 创建一个空数组对象 3 var arr1=[]; 4 5 //2 创建数组的同时,维数指定初始元素 6 var arr2=[1,2,3,4,5]; 7 8 //3 用new关键字创建一个数组类型对象,并返回新对象的地址 9 var arr3=new Array(); 10 11 //4 创建n个元素的数组空数组;创建带初始元素的数组 12 var arr4=new Array(4);//创建四个元素的空数组 13 var arr5=new Array(1,2,3,4,5); 14 15 /* 16 js数组下标越界不会出错 17 为不存在的位置赋值:不会出错,会自动创建指定下标的新元素 18 从不存在的位置取值:不会报错,也不会增加新元素,而是返回undefined 19 所有没有赋值的变量的默认值为(自动赋值)undefined; 20 主动释放一个变量引用的对象使用null; 21 当使用完一个较大的对象时,主动释放对象是好的习惯; 22 */
三、数组的复制与取值
1 //数组赋值 数组变量[i]=新值; 2 arr2[2]=99; 3 4 //数组取值 数组变量[i]; 5 var i=arr2[0];
四、length属性
1 /*获取数组中的元素个数(不等于实际的元素个数) 2 示例: 3 arr[arr.length-1];获得任意长度数组中的最后一个元素 4 arr[arr.length]=Value; 向数组末尾追加一个新元素 5 改小length的值,可以删除末尾元素 6 */ 7 var att=[1,2,3,4,5]; 8 console.log(att.length);//5 9 att[100]=100; 10 console.log(att.length);//101 11 console.log(att);//[1, 2, 3, 4, 5, 100: 100]
length属性大多用于索引数组的遍历
五、关联数组
定义:可以自定义下标的数组(索引数组:自动生成下标的数组都是索引数组)
1 /*示例*/ 2 var fbb=[]; 3 fbb["sname"]="范冰冰"; 4 fbb["shx"]=91; 5 fbb["yuw"]=65; 6 fbb["eng"]=95; 7 console.log(fbb);//[sname: "范冰冰", shx: 91, yuw: 65, eng: 95] 8 /* 9 关联数组中的length属性失效 10 关联(hash)数组:下标不能重复;优点:利用Hash算法,精确定位某个下标的位置,不用遍历 11 索引数组:缺点:小标自动分配无意义,想要内容查找元素,只能从头开始遍历 12 */ 13 14 /*关联数组遍历*/ 15 for(var key in fbb){ 16 console.log(key+" : "+fbb[key]); 17 }//sname : 范冰冰 shx : 91 yuw : 65 eng : 95
六、数组API
1.数组输出toString(2种):
1 /*var str=arr.toString();-->输出数组中的内容,每个元素用逗号分隔,自动调用 2 var str=arr.join(“”);-->输出数组中的内容,自定义元素间连接符 3 */ 4 var arr=[1,2,3,4,5]; 5 console.log(arr);//[1, 2, 3, 4, 5] 默认toString()方法 6 console.log(arr.join("-"));//1-2-3-4-5 自定义连接符 7 8 /*join的两种固定使用方式 9 1.将字符组成单词:arr.join(""); 10 2.将单词组成句子:arr.join(" "); 11 */ 12 var arrChar=["H","e","l","l","o"]; 13 console.log(arrChar.join(""));//Hello 14 var arrWord=["My","name","is","Medeor","."]; 15 console.log(arrWord.join(" "));//My name is Medeor .
2.拼接concat和截取slice
1 /*concat示例 ar newArr.concat(另一个数组,值1,值2,...);*/ 2 var arr=[1,2,3,4,5]; 3 var newArr=arr.concat([6,7,8,9,0]); 4 console.log(newArr);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 5 6 /*slice var subArr=arr.slice(starti,endi+1);//含头不含尾 7 (API无法直接修改原对象,而返回新对象)*/ 8 var subArr=newArr.slice(3,7); 9 console.log(subArr);//[4, 5, 6, 7]
3.splice 删除、插入、替换(直接修改原对象)
1 /*1.删除:[var deleted=]srr.splice(strti,删除个数);*/ 2 var arr=[1,2,3,4,5,6,7,8,9,0]; 3 arr.splice(2,3);//从下表为2的元素开始删除3个元素 4 console.log(arr);//[1, 2, 6, 7, 8, 9, 0] 5 6 /*2.插入:arr.splice(starti,0,新值1,...);*/ 7 arr.splice(2,0,5,4,3);//从下表为2的元素开始删除0个元素 插入5 4 3 8 console.log(arr);//[1, 2, 5, 4, 3, 6, 7, 8, 9, 0] 9 10 /*3.替换:arr.splice(starti,删除个数,新值1,...);*/ 11 arr.splice(2,3,"a","b","c");//从下表为2的元素开始删除3个元素 插入a b c 12 console.log(arr);//[1, 2, "a", "b", "c", 6, 7, 8, 9, 0]
4.arr.reverse();颠倒数组中所有元素(直接修改原对象)
5.sort() 数组排序
无参数:如果调用该方法时没有使用参数,(对数组元素进行toString()转成字符串)按照字符编码的顺序进行排序。
1 var arr=["b","a","d","z","w","y","i"]; 2 arr.sort();/*无参数*/ 3 console.log(arr.join(" "));//a b d i w y z
1 arr=[1,12,4,7,49,100]; 2 arr.sort(); 3 console.log(arr.join(" "));//1 100 12 4 49 7 4 /*问题:默认将所有元素转为字符串升序排列,数字也是按照字符编码排序 5 比较器函数:专门比较任意两值大小的函数 6 特点(2个): 7 1.2个参数,分别表示要比较的任意两值 8 2.无论比较逻辑是什么,都要返回一个数字 9 颠倒比较器结果的正负,可以改升序为降序排列 10 */ 11 // 定义比较器函数 12 function sortNumber(a,b){return a - b} 13 arr=[1,12,4,7,49,100]; 14 arr.sort(sortNumber); 15 console.log(arr.join(" "));//1 4 7 12 49 100
6.push()和pop() 模拟末尾出入栈操作
js中没有真正的栈和队列的类型,一切都是用数组对象模拟
栈:只能从一端进数组,另一端封闭
队列:从一端进入数组,从另一端出
入栈:arr.push(value1,value2,...);
出栈:var last=arr.pop();
1 //末尾入栈 2 var arr=[1,2,3,4,5]; 3 var lh=arr.push(6,7,8,9); 4 console.log("新数组长度:"+lh+" "+arr);//新数组长度:9 1,2,3,4,5,6,7,8,9 5 6 //末尾出栈 7 var last=arr.pop(); 8 console.log("数组最后一个元素:"+last+"; Length:"+arr.length);// 数组最后一个元素:9; Length:8 9 console.log(arr);// [1, 2, 3, 4, 5, 6, 7, 8]
7.unshift()和shift() 模拟开头出入栈操作
入栈:arr.unshift()
出栈:var first=arr.shift()
1 //开头入栈 2 var arr=[1,2,3,4,5]; 3 var lh=arr.unshift(6,7,8,9); 4 console.log(arr+" lh="+lh);//6,7,8,9,1,2,3,4,5 lh=9 5 6 //开头出栈 7 var first=arr.shift(); 8 console.log("first="+first+" "+arr);//first=6 7,8,9,1,2,3,4,5
8.push()和shift()模拟结尾如队,开头出对的队列
9.unshift()和pop()模拟开头入队,结尾出对的队列
七、二维数组数组
二维数组:数组中的元素,又引用了另一个子数组对象
何时使用二维数组(2种):
1. 只要保存横行竖列的二维数据
2. 保存上下级关系的数据时
创建二维数组(2种):
1 //1. 先创建空数组,再赋值: 2 var arr=[]; 3 arr[0]=["石家庄","保定","唐山"]; 4 arr[1]=["德州","济南","烟台"]; 5 6 //2. 创建数组时,同时初始化子数组: 7 var data=[ 8 [0,2,2,4], 9 [2,4,4,8], 10 [16,32,16,8], 11 [4,2,128,4] 12 ];
访问二维数组中的数据:arr[行下标][列下标]
比如:data中第2行,第3个元素
data[1][2]
强调:二维数组中,行下标不能越界!
遍历二维数组:
1 //固定套路:外层循环遍历行,内存循环遍历列 2 var arr=[[1,2,3,4],[5,6,7,8],[9,0,11,12]]; 3 for(var r=0;r<arr.length;r++){ 4 for(var c=0;c<arr[r].length;c++){ 5 console.log(arr[r][c]);//输出数组每一个元素 6 } 7 }
Array