一、数组
分为两种 关联数组:可以自己定义下标名称的数组
索引数组:自动生成下标的数组都是索引数组
1、创建、赋值和取值
①创建:4种:
1. var 变量名=[]; 创建一个空数组对象
2. var 变量名=[值1,值2,...](常用)创建数组同时,为数组指定初始元素(数组中每个值)
数组是引用类型的对象,变量中保存了数组对象的地址值
3. var arr=new Array(); 创建一个空数组对象
new:创建一个新对象,并返回新对象地址,Array:js中的数组类型
new Array()-->创建一个数组类型的新对象,并返回新对象的地址。
4. var arr=new Array(n);-->创建n个元素的数组,new Array(值1,值2,...)
② 赋值:数组变量[i]=新值;
找到数组:使用变量等效于直接使用变量引用的数组对象
数组对象中,每个元素都有一个下标:每个元素的位置号,
下标从0开始,到元素个数-1结束
③ 取值: 数组变量[i]
数组变量[i]-->获得i位置元素中的值
2、js数组下标越界不会出错!
为不存在的位置赋值:不会出错!会自动创建指定下标的新元素。
从不存在的位置取值:不会出错!也不会增加新元素,而是返回undefined
3、 .length属性:数组是对象,封装了一组数据,并提供了对数据的操作方法
①常用方式 arr[arr.length-1]: 获得任意长度数组中的最后一个元素
arr[arr.length]=新值: 向数组末尾追加一个新元素
改小length的值,可删除末尾元素
②获得数组中的元素个数不一定等于实际的元素个数
例:var a=[];a[5]=5;console.log(a.length);console.log(a[2]);//输出:6 undefined
实际只赋值一个元素,length却为6,其余未被赋值都为undefined
4、数组遍历:从下标0位置开始,依次取出每个元素,反复执行相同的操作。
① 循环条件:下标i<arr.length②循环变量:下标i, 从0开始,每次增1,直到arr.length-1③ 循环体:xxx
例 var a=[1,1,2,3,5,8];
for(var i=0;i<a.length;i++){
console.log(a[i]);
} //输出1 1 2 3 5 8
5、关联数组:可以自己定义下标名称的数组
①创建关联数组: var arr=[];
arr["key1"]=value1;
arr["key2"]=value2;
例 var SLP=[];
SLP["yanzhi"]=100
SLP["caihua"]=100
SLP["English"]=0
②如何访问关联数组中的元素:arr["key"]
关联数组: 下标是不能重复的
优势:精确定位某个下标的位置,不用遍历
索引数组:下标自动分配,无意义(常见)
缺点:要想按内容查找元素,只能从头开始遍历!
③遍历关联数组:依次遍历arr中每个元素,将当前元素的下标存入key中
关联数组中的.length属性失效!
for(var key in arr){
key; //得到当前元素的下标
arr[key]; //得到当前元素的值!
}
例:var SLP=[];
SLP["yanzhi"]=100;
SLP["caihua"]=100;
SLP["English"]=0;
for(var key in SLP){
console.log(key+":"+SLP[key]);
};
//结果: yanzhi:100 caihua:100 English:0
6、冒泡排序
var a=[7,16,8,6,15]
for(i=1;i<a.length;i++){
for(j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
max=a[j];
a[j]=a[j+1];
a[j+1]=max;
}}}
console.log(a);// [6, 7, 8, 15, 16]
7、数组API:
①无法直接修改原对象,而返回新对象API(常考)
toString() join() concat() slice()
②数组 to String:2种:
var str=arr.toString();-->输出数组中的内容,每个元素用逗号分隔
var str=arr.join("连接符")(常用)-->输出数组中的内容,自定义元素间连接符
使用的2种固定套路
1. 将字符组成单词:arr.join("") //效果:abcd
2. 将单词组成句子:arr.join(" ") //效果:a b c d
③拼接:var newArr=arr.concat(另一个数组,值1,值2...)
例:a=[1,2,3,4];b=[7,8,9];
var c=a.concat(10,b);
console.log(a); //a不改变,说明不能直接修改原对象
console.log(c);
//输出 [1, 2, 3, 4] [1, 2, 3, 4, 10, 7, 8, 9]
④截取:var subArr=arr.slice(starti[,endi+1]);含头不含尾,starti和endi代表数组下标
第二个参数可以省略,代表一直截取到结尾,参数可以取负值,负值从右数,从-1数起
例:var arr=[0,1,2,3,4,5,6];
console.log(arr.slice(0,3)); //输出 [0, 1, 2],含头不含尾
console.log(arr.slice(-1,-3)); //输出 [] ,方向写反了,无法从后向前截取
console.log(arr.slice(-3,-1)); //输出 [4, 5] ,取负数最后一位下标为-1,也含头不含尾
⑤ splice: 删除 、插入、替换(数组最强大的API)
删除:arr.splice(starti,删除个数)
插入:arr.splice(starti,0,新值1,...)
替换:arr.splice(starti,删除个数,新值1,...)
基本结构
arr.splice ( 3, 2, 21,22,23,24);
从第三位开始(含头) 删两个 替换为21,22,23,24
例:arr=[11,12,13,14,15,16,17,18,19];
arr.splice (3,2,21,22,23,24);
console.log(arr);
//输出 [11, 12, 13, 21, 22, 23, 24, 16, 17, 18, 19]
⑥ arr.reverse(); 颠倒数组中所有元素
arr=[11,12,13,14,15,16,17,18,19];
console.log(arr.reverse()); // [19, 18, 17, 16, 15, 14, 13, 12, 11]
⑦arr.sort()按Unicode码排序
例:var a=[1,12,4,46,3,35];
console.log(a.sort()); // [1, 12, 3, 35, 4, 46]
如何让sort()方法按数值大小排序,定义一个比较器函数
function compare(a,b){return a-b}
例: var a=[1,12,4,46,3,35];
function compare(a,b){return a-b}
console.log(a.sort(compare)); //[1, 3, 4, 12, 35, 46]
8、栈和队列:js中没有真正的栈和队列的类型,一切都是用数组对象模拟的
一) 栈:只能从一端进出的数组,另一端封闭 (FILO first in last out 先进后出)
① 末尾出入栈:已入栈元素的下标不再改变
入栈: arr.push(新值1,...)
出站: arr.pop()
var a=[1,12,4,46,3,35]; a.pop(); console.log(a); // [1, 12, 4, 46, 3]
var a=[1,12,4,46,3,35]; a.push(11,22); console.log(a); // [1, 12, 4, 46, 3, 35, 11, 22]
② 开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移。
入栈:arr.unshift(新值1,...);
出站:arr.shift();
var a=[1,12,4,46,3,35]; a.unshift(11,22); console.log(a); // [11, 22, 1, 12, 4, 46, 3, 35]
var a=[1,12,4,46,3,35]; a.shift(); console.log(a); // [12, 4, 46, 3, 35]
二) 队列:只允许从末尾进入数组,必须从开头出数组(FIFO first in first out 先进先出) 结尾入队列:arr.push();
开头出队列:arr.shift();
9、二维数组:数组中的元素,又引用了另一个子数组对象
① 使用二维数组场景2种:
要保存横行竖列的二维数据
要保存上下级关系的数据时
② 如何创建二维数组2种:
1. 先创建空数组,再赋值:
var arr=[];
arr[0]=["石家庄","保定","唐山"];
arr[1]=["德州","济南","烟台"];
2. 创建数组时,同时初始化子数组:
var data=[
[0,2,2,4], //第0行
[2,4,4,8], //第1行
[16,32,16,8], //第2行
[4,2,128,4] //第3行
];
如何访问二维数组中的数据:arr[行下标][列下标]
比如:data中第2行,第3个元素,data[1][2]
强调:二维数组中,行下标不能越界!
console.log(data[1][5]); //undefined
console.log(data[5][1]); // Uncaught TypeError
③遍历二维数组:
固定套路:外层循环遍历行,内存循环遍历列
var arr=[[...],[...]...]
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c]);
}
}