1.***数组:多个变量的集合,起了一个统一的名字 --用法
连续保存多个数据的引用类型的对象 --存储
为什么要使用数组:
程序=算法+数据结构
好的数据结构。可以极大提高程序的执行效率
何时使用:程序中都是用数组集中管理多个数据
如何使用:创建 赋值 取值
1.创建:4种
1.创建空数组:var 数组名=[]; -->js中见到[],就是数组
2.创建数组同时,初始化数组中的每个元素:
var 数组名=[值1,值2,值3........];
内存中的数组名:引用类型的对象;每个值相当于一个元素;每个元素都有一个下标;
下标从0开始,每次增1,倒数个数-1
数组对象的个数:arr.length arr.length永远等于最后一个下标+1
3.创建空数组:var 数组名=new Array(); -->([n]);
new:创建一个新对象
Array:数组类型
n:表示初始元素的个数,省略则创建空数组
4.创建数组同时初始化数组元素:
var 数组名=new Array(值1,值2 .....);
如何使用数组中每个元素:数组名[i]
数组名[i]的用法和普通的变量完全相同
2.赋值:
1.数组名[i]=值
2.不限制: --和其他语言最大的不同
1.不限制元素的个数:没有数组越界错误,length自动增长为最大下标+1
2.不限制元素的类型
3.取值:任何位置使用数组名[i],等效于直接使用数组名[i]中的值
数组是引用类型的对象:
原始类型的值,复制后,相互不影响
将数组中保存的数组对象的地址值,复制给另一个 ---引用类型
引用类型的对象,赋值后,依旧引用同一个对象,任何修改,都会影响对方
给一个数组赋值为null,即为释放
null:主动释放一个对象
垃圾回收器:专门释放内存中不再被引用的对象的小程序,伴随主程序执行;
每个对象都有一个引用计数器,增加引用+1,减少引用-1
一个对象,引用计数器为0,不再被任何变量引用时,才能被回收
建议:使用完较大的对象后,都要主动释放
数组的length属性固定套路:2个
1.获得最后一个元素值:arr[arr.lenght-1]
2.向数组末尾追加一个新元素:arr[arr.lenght]=新值
遍历数组:依次对数组中每个元素执行相同操作
//三要素:
1.下标:i<数组长度
2.变量:下标i从0开始,每次++
for(var i=0;i<arr.length;i++){
当前元素:arr[i]
}
如何遍历hash数组:
for(var key in hashArr){//反复取出每个key放入
}
for in 结构也可以遍历索引数组,但是无法控制开始和结束,默认从头开始到尾部结束
今后:只要遍历索引数组,选普通for循环;只要遍历关联数组,hash数组,只能用for in循环
笔试题:例1:
var chyx=[]; chyx["name"]="小笼包"; chyx["sx"]=81; chyx["yw"]=61; chyx["yy"]=89; var keys=[]; var i=0; for(keys[i++] in chyx);//获取一个关联数组所有的下标 console.log(keys);//name sx yw yy
例2:定义一个函数,找出一个整数中的最大值
/*定义一个函数,找出一个整数中的最大值*/ /*定义一个函数 getMax,接收一个数组对象参数arr * 将arr中第一个元素放入变量max * i从1开始遍历arr中的元素的值 * 如果当前元素>max * 将当前元素存入max中 * 遍历返回max*/ function getMax(arr){ var max=arr[0]; for(var i=1;i<arr.length;i++){ if(arr[i]>max){ max=arr[i]; } } return max } /*var arr=[4,6,2,5,9,7];*/ console.log(getMax([4,6,2,5,9,7]))
例3:定义函数,去掉数组中重复元素
/*定义函数,去掉数组中重复元素*/ /*定义函数delRepeat,接收一个数组arr*/ function delRepeat(arr){ //定义空数组hash //i从第一个元素开始遍历arr中每个元素 // 将当前元素作为key,加入hash中,值设置为1 //(遍历结束后)将arr重置为空数组 //使用for in循环将hahs中每个key放入arr中 //返回arr var hash=[]; for(var i=0;i<arr.length;i++){ hash[arr[i]]=1; } arr=[]; i=0; for (arr[i++] in hash); return arr; } console.log(delRepeat(["a","a","d","v","v","r","f","a"]))
2.数组的API:浏览器厂商已经实现的方法;开发人员直接调用,不需要了解具体实现
将数组装换为字符串:2个
var str=arr.toString():返回数组中元素的内容,用逗号分隔
var str=arr.join("连接符"):***可自定义链接符***
固定套路:
1.无缝拼接数组每个元素:var str=arr.join("") --如果不加“ ”,等效于加;
2.将单词拼接为句子:var str=arr.join(" ");
3.将数组拼接为html元素:案例:
var provs=["北京市","天津市","河北省"]; var html="<select><option>"+provs.join("</option>><option>")+"</option></select>";
优化:数组的拼接比字符串拼接效率更高!
建议:今后凡是频繁的字符串拼接,都要2步:
1.先将要拼接的子字符串放入一个数组中
2.调用数组的join方法,一次性生成结果字符串
获取数组字符串:toString()方法可以把数组转换为字符串,并返回结果
join([separator])返回一个字符串,由每个元素转换而成的字符串使用指定的separator拼接而成
获取子数组:var subArr=arr.slice(stari,endi+1);
starti:开始获取的下标位置
endi:表示获取到的小标位置
***含头不含尾
slice方法支持倒数参数:其实负数下标不存在;假定的负数下标从-1开始
splice:删除 插入 替换
1.删除:arr.splice(starti,n) --从starti位置开始,删除n个元素
2.插入:arr.splice(starti,0,新值1,新值2,....) --在starti位置插入新值1,新值2 ,原stari位置及其之后的元素,被 顺移
3.替换:arr.splice(starti,n,新值1,新值2.....)
新元素的个数和n不一定相等
数组会自动调整元素的位置和长度
颠倒数组中所有元素的位置:arr.reverse();
强调:
var x=arr[i];//将arr[i],复制一份,改x,与arr[i],无关
3.数组的sort方法:arr.sort()
特点:默认按升序排列;默认一切都转为字符串,再按字符串比大小
自定义排序规则:2步:
1.定义比较器函数:专门比较任意两值大小的函数
规定:两个参数(a,b);
必须返回数字:如果a>b,就要返回正数
如果a<b,就要返回负数
如果a=b,就要返回0
//定义比较器函数 function compare(a,b){ /* return a-b;*/ return parseFloat(a)-parseFloat(b); }
2.将比较器函数对象作为参数传入sort方法中:
arr.sort(比较器函数对象函数名)
//定义比较器函数 function compare(a,b){ /* return a-b;*/ return parseFloat(a)-parseFloat(b); } arr.sort(compare); console.log(arr);
//函数作为对象传给别人用,不加()
冒泡排序:bubble --手写级别
function bubble(arr,compare){ for(var r=1;r<=arr.length-1;r++){ for(var i=0;i<arr.length-r;i++){ if(compare(arr[i],arr[i+1])>0){ var temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } } } function compare(a,b){ return parseFloat(a)-parseFloat(b); } var arr=['35px','12px','5px','123px']; bubble(arr,compare); console.log(arr);
函数 VS 方法:
1.都是function对象
2.不属于任何对象的叫函数(不需要通过.访问)
3.属于特定对象的函数叫方法(需要通过对象,才可以访问)