多个数据/元素组成的一个集合,保存在一个变量中
特点:
- 数组中的元素都是按照线性来排列的:
- 除了第一个元素,每个都有唯一的前驱元素
- 除了最后一个元素,每个都有唯一的后继元素
- 下标:数组中的每个元素都有一个唯一的位置序号,称为下标,用来表示数组中的每一个元素
1.创建数组
直接量方式
var arr=[];
var arr=[数据1,数据2,...];
构造函数方式
var arr=new Array();
var arr=new Array(数据1,数据2,...);
2.访问数组
获取数组:数组名[下标]
- 下标越界,会获取undefined
添加数组:数组名[下标]=新数据;
- 若该下标处已有元素,则为替换
- 若下标越界,会导致数组变成稀疏数组,中间会出现很多undefined,且下标不再连续
数组的3不限:
- 不限制元素的长度
- 不限制元素的类型
- 不限制下标越界
3.数组对象(唯一属性)
数组名.length 获取到数组的长度
- 向末尾添加元素
arr[arr.length]=新值 - 获取倒数第n个元素
arr[arr.length-n] - 删除末尾的n个元素
arr.length-=n
4.遍历数组
将数组中的每个元素都取出来,执行相同或相似的操作
for(var i=0;i<arr.length;i++){
arr[i]//当前次获取到的元素
}
5.如何释放一个引用类型
找清楚该引用类型由几个变量名引用着,每个变量都要释放
6.数组分类
- 索引数组:下标都是数字组成的数组,默认数组
- hash/关联数组:下标可自定义的数组
创建
- 创建一个空数组
var arr=[] - 添加自定义下标并赋值
arr["自定义"]=值
访问
arr.["自定义下标"]
遍历
hash无法使用for循环,因为length失效,关联/hash数组length永远为0,下标也不为数字
for in循环 for(var i in 数组名){数组名[i];}
- for in循环不仅可以遍历hash数组,也可以遍历索引数组,但for in不能自己设置从哪里开始,到哪里结束,仅能用于遍历
- js中除undefined和null不是对象,其余皆为对象,且一切对象的底层都是hash数组
hash原理
- hash算法:将字符串交给hash,会得到一个尽量不重复的数字,但若字符串内容相同,那么得到的数字也一定相同
- 添加元素:将自定义的下标交给hash算法,会得到一个数字即地址值,再将要保存的数据放入地址
- 获取元素:将指定的下标交给hash算法,会得到一个和添加时相同的数字即地址,则得到地址中保存的数据
数组的API
数组转为字符串
var str=arr.join("自定义连接符");
- 若传入实参,则和toString/String相同,默认由,分隔
- 固定使用
- 提供给一个数组,无缝凭借里面的内容变为字符串:
var str=join("");- 将数组中的数据拼接为页面上的元素:
var str="<option>"+arr.join("</option><option>")+"</option>";
拼接数组,添加元素到末尾
var newArr=arr.concat(值1,arr1,...);
- 此方法不修改原数组,只会返回一个新数组
- 传参时支持数组参数,会悄悄打散数组,单独传入
截取字符串
从starti位置截取到endi位置,组成一个新数组
var subArr=arr.slice(starti,endi)
- 此方法不修改原数组,只会返回一个新数组
- 含头不含尾,从strati 到 endi-1,不含endi
- 第二实参可以省略:从starti截到末尾
- 浅拷贝:按值传递--第一实参也可以省略:从头截到尾
- 深拷贝:复制了一个副本给对方
- 支持负数参数,-1代表倒数第一个
删除、插入、替换
- 删除:
var dels=arr.splice(starti,n);//从starti开始删除n个- 特殊:此方法其实有返回值,所有删除的元素组成的一个新数组
- 插入:
arr.splice(starti,0,值1,...);//从starti开始删除0个,插入了新元素- 特殊:原来starti位置的元素以及后续元素都会被向后移动
- 替换:
var dels=arr.splice(starti,n,值1,...);- 特殊:插入的个数和删除的个数可以随意
翻转数组
arr.reverse();
排序
arr.sort(function(a,b){return a-b});
- 默认按照字符串按位PK每个字符的unicode号排序
- 按照数字排序
- function(){}回调函数:不需要程序员调用的函数:悄悄的带有循环,提供了两个形参:a是后一个数,b是前一个数
- return a-b
- 如果a>b,返回是一个正数
- 如果a<b,返回是一个负数
- 如果a==b,返回是一个0,sort根据你反复的结果,来判断两者要不要交换位置
栈和队列
- 开头进:
arr.unshift(值1,...); - 开头出:
var first=arr.shift();//一次只能删掉一个,并且会返回删除的元素 - 结尾进:
arr.push(值1,...); - 结尾出:
var last=arr.pop();//一次只能删掉一个,并且会返回删除的元素
二维数组
创建 var arr=[["张三丰",128,3500],["张翠山",30,4500],["张无忌",18,5500]];
访问 arr[r][c];
- 列下标越界:返回undefined
- 行下标越界:报错:undefined不能使用[]
遍历二维数组:必然需要两个循环嵌套:外层循环控制行,内层循环控制列
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c]);
}
}