数组的基础
创建数组
直接量
var arr=【值1,...】;
构造函数
var arr=new Array(值1,...);
这个方法有一个坑:
new Array(num);
这句话的意思是创建一个长度为num的数组,里面没有任何东西,只有无数的undefined
面试题
按值传递:
var a=31;
var b=a;
修改a、b变不变或者修改b,a变不变
![](https://img-blog.csdnimg.cn/img_convert/cc8bc8715220816d97e3dc2deefd4715.png)
传递类型
原始传递:
复制一个副本给对方,两者互不影响
![](https://img-blog.csdnimg.cn/img_convert/948c8330eb04b27683b63aa2c481f1b7.png)
引用传递
js中不是原始类型就是引用类型(函数、数组都是引用类型)
因为引用类型很大,比原始类型大得多,不可能保存在变量本地,只是保存了一个地址值,其实是赋值了自己的地址值给对方,两者用的是同一个地址值,一个修改另一个也会变化
如何释放一个引用类型
一定要看清楚有几个变量引用着这个引用类型,每个变量都要释放后才能释放干净
在js底部有一个垃圾回收器,只有垃圾回收器的计数器为0时才会删除不要的数据
建议:我们的代码都要封装为一个函数,函数中的一切变量都会自动释放
hash数组(关联数组)
如何使用
创建:2步
创建空数组:var arr=[];
为数组添加自定义下标并且赋值:arr["自定义下标"]=新值;
![](https://img-blog.csdnimg.cn/img_convert/226b0c9182635a6862040b3d6759e63c.png)
访问元素
arr["自定义下标"];
强调
不能在使用for循环,必须使用for in循环
for in不能称呼为一个循环,因为它不需要设置从哪里开始到哪里结束,纯自动化的,专门为了遍历hash数组存在的
不止能遍历hash数组,也能遍历索引数组
建议:索引数组依然是for,hash数组再使用for in
hash数组原理
hash算法:
将字符串,计算出一个尽量不重复的数字(地址值)字符串内容相同,则计算出来的数字也一定是相同的
添加元素:
将自定义下标交给hash算法,得到一个数字(地址值),直接将你要保存的数据放到此地址保存起来
获取元素:
将指定的自定义下标交给hash算法,得到一个和当初保存时一样的数字(地址值),通过此地址找到你当初保存的数据,取出来使用
js里面一切的东西都是对象,万物皆对象,除了undefined和null
目的:
是为了对象做准备工作
数组API
arr 转 str:
var str=arr.join("自定义连接符");
固定套路:2个
将数组里面的内容拼接为一句话/单词
var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
ar str=arr.join(""); //其实就是拼接了一个空字符串
console.log(str);
将数组拼接为DOM页面元素
var arr=["-请选择-","北京","南京","西京","东京","重庆"]; //拿数据
var str="<开始标签>"+arr.join("</结束标签><开始标签>")+"</结束标签>"; //将数组拼接为页面标签字符串
sel.innerHTML=str; //innerHTML能够识别标签
数组拼接:
添加元素的新方式
将你传入的实参全部拼接到arr的末尾
var newArr=arr.concat(新值1,arr1,...);
ii. 特殊:
不修改原数组,只会返回一个新数组
concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素再拼接
截取子数组:
根据你传入的开始下标截取到结束下标
var subArr=arr.slice(starti,endi+1);
特殊:
不修改原数组,只会返回一个新数组
含头不含尾
endi可以省略不写,如果省略,会从starti位置一直截取到末尾
starti也可以省略,如果两个实参都省略,那么会从头到尾完全的复制一份:此操作也叫做深拷贝
支持负数参数,-1代表倒数第1个
以上的API都是不修改原数组的
删插替:
删除:
var dels=arr.splice(starti,n);//n代表删除的个数
特殊:
虽然他直接修改原数组,但是也有返回值,返回的是被删除的数据组成的一个新数组,因为考虑到有可能删除的东西刚好是需要的东西,哪怕没有删除也会返回一个空数组
插入:
arr.splice(starti,0,新值,...);
特殊:
原starti位置的元素以及后续元素都会向后移动
尽量的不要插入一个数组,会导致我们的数组一些是一维,一些是二维,遍历的时候就非常不方便
替换:
var dels=arr.splice(starti,n,新值,...);
特殊:
删除的个数和插入的个数不必相同
翻转数组:
arr.reverse();
![](https://img-blog.csdnimg.cn/img_convert/1b9ac138c132bd87a4fb625b4f610503.png)
数组排序:
笔试题:
冒泡排序:前一个元素和后一个元素进行对比,如果前一个>后一个,两者就交换位置,但是做完一轮发现只有最大的一个数字到了最后,所以再开循环反复使用
固定公式:
![](https://img-blog.csdnimg.cn/img_convert/b72f50f1e3c5768e3ed15dbcb5160996.png)
正式开发时:
arr.sort();
默认:将数组中的元素转为字符串后,再按位PK每个字符的unicode号(ASCII码)
按照数字升序排列:
![](https://img-blog.csdnimg.cn/img_convert/756678a85185496f6110908887924ac8.png)
按照数字降序排列:
![](https://img-blog.csdnimg.cn/img_convert/d50c47650df17abc76bc02da93a6687f.png)
以上的API都会修改原数组