数组的API:前辈们提前定义好的,程序员可以直接使用的,这些函数只有数组可用;
1、这些API都不会修改原数组:
1:arr to string:
var str=arr.join("自定义链接符");
固定套路:2个
1:笔试题:将数组里面的内容拼接为一句话/单词;
无缝拼接:var str=arr.join("");
2:将数组拼接为DOM页面元素
//数据
var arr=["北京","南京","西京","东京","重庆","贵州","黔南"];
//转为字符串,并且拼接好标签
var str="<开始>"+arr.join("</结束><开始>")+"</结束>";
//渲染到DOM树上
elem.innerHTML=str;
2:数组拼接:添加元素的新方式
把你传入的实参全部拼接到arr的末尾,
var newArr=arr.concat(新值1,...);
特殊:1、不会修改原数组,只会返回一个新数组
2、concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素后再拼接到末尾
3:截取子数组:
根据你传入的开始下标截取到结尾下标
var subArr=arr.slice(starti,end+1);
特殊:1、不会修改原数组,只会返回一个新子数组
2、含头不含尾
3、endi其实可以省略不写,会从starti位置一直截取到末尾
4、其实两个参数都可以省略不写--会从头截到尾(深拷贝),和以前的按值传递(浅拷贝)不同,一个修改不会影响到另一个
2、这些API都会修改原数组
4、删除、插入、替换:arr.length-=n
删除:var dels=arr.splice(starti,n);//n代表删除的个数
特殊:其实splice也有返回值,返回的是删除元素组成的一个新数组
插入:arr.splice(starti,0,值1,...);
注意:1、原sterti位置的元素以及后续元素都会向后移动
2、千万不要插入一个数组,会导致我们的数组一些是一维,一些是二维,遍历时会非常难受
替换:var dels=arr.splice(starti,n,值1,...);
注意:删除的元素个数不必和插入元素的个数相同;
5、翻转数组:arr.reverse();--以后不会再使用;
Array API: 1:排序:两种方式:
1、面试中要求手写冒泡排序:从第一个元素开始,依次比较相邻的两个元素,只要前一个元素大于后一个元素,两者就交换位置;
公式:
for(var j=1;j<arr.length;j++){
for(var i=0;i<arr.length-j;i++){
if(arr[i]>arr[i+1]){
var middle=arr[i+1]
arr[i]=arr[i+1]
arr[i+1]=middle;
}
}
}
2、正式开发中:排序的API
arr.sort();
问题1:默认会将元素们转为字符串,按位PKascii码,如果希望数字排序?
解决:
arr.sort(function(a,b){//回调函数
console.log(a);//拿到后一个
console.log(b);//拿到前一个
return a-b;//如果return返回的是一个正数,说明后一个数大于前一个数
//如果return返回的是一个负数,说明后一个数小于前一个数
//如果return返回的是一个0,说明后一个数==前一个数
//而我们的sort方法刚好可以根据你返回的正数/负数/0来进行排序
});
问题2:只能升序排序,如何降序
arr.sort(function(a,b){
return b-a;
})
强调!!!:排序其实非常重要,切记,只要以后页面中有排序功能,他的底层一个是一个数组,因为只有数组具有排序的方法;
栈和队列:添加元素和删除元素的新方法
栈:其实就是数组,只不过是一段封闭,只能从另一端进去的数组;
何时使用:优先使用最新的数据;
如何使用:
开头进:arr.unshift(新值,...);//向前添加元素,缺陷是导致其余元素的下标发生改变
开头出:var first=arr.first();//向前删除元素,缺陷是导致其余元素的下标发生改变
结尾进:arr.push(新值,...);//向后添加元素,完全等效于arr[arr.length]或者arr.concat;
结尾出:arr.pop();//向后删除元素;
队列:其实就是数组,只不过是一端进,另一端出
何时使用:根据先来后到的顺序;
开头进:arr.unshift(新值,...);
结尾出:arr.pop();//向后删除元素;
*结尾进:arr.push(新值,...);
开头出:var first=arr.first();
ES3的数组API就算是学完啦,后面ES5还提供了6个API等待我们学习