🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 关于arguments arguments是一个类数组集合,它不是数组,不能直接使用数组的方法 ## slice ``` //Array.prototype.slice = function(){} var ary = [12,23,34]; ary.slice(); //让找到的slice方法执行,在执行 slic方法的过程中,才把ary数组进行了截取 ``` IE6~8中,不支持借用数组的slice实现将元素集合的类数组转化为数组,但是arguments是支持的。 ``` var utils = { listToArray:function(likeAry){ var ary = []; try{ ary = Array.prototype.slice.call(likeAry); }catch(e){ for(var i=0;i<likeAry.length;++i){ ary[ary.length] = likeAry[i]; } } return ary; } } ``` ## toString ``` console.log([1,2,3,4,5].toString()) //1,2,3,4,5 ``` 模拟内置的slice实现数组克隆的功能 ```javscript Array.prototype.mySlice = function(start,end){ //this->当前要操作的这个数组ary var ary = []; end=end?end:this.length-1; for(var i=start;i<end;++i){ ary[ary.length] = this[i]; } return ary; } ``` ``` //--- --- --- //arguments变成真·数组原理 // for(var i=0;i<arguments.length;++i){ // ary[ary.length] = arguments[i]; // } // return ary; //通过call等将slice方法中的this替换成了aruguments ``` ## sort 返回排序后的数组。原数组已经被排序后的数组代替 sort默认不传参可以处理10以内的数字排序 ``` ary.sort(); ``` 回调函数:把一个方法A当做参数值传递给另外一个函数B,然后在B执行的过程中,我们随时根据需求让A方法执行 ``` function A(){ } function b(){ fn(); fn(); fn(); } B(A) ``` ``` ary.sort(function(a,b){ //a->每一次执行匿名函数的时候,找到的数组中的当前项 //b->当前项的后一项 return a-b; //->升序 return b-a;//->降序 //->return的是一个>0 或 <=0的数,大于>0让a和b交换位置,小于等于0,原来的位置不动 }) ``` ``` ary.sort(functio(a,b){ return 1; //永远交换位置 }); ``` ### 二维数组排序 ``` var ary = [ {name:'克丽丝',age:78} ,{name:'安吉拉',age:13} ,{name:'艾伯特',age:107} ,{name:'梅森',age:256} ]; //->给二维数组排序,按照年龄由小到大进行排序 ary.sort(function(a,b){ return parseFloat(a.age) - parseFloat(b.age); }) ``` ### localeCompare ![](https://box.kancloud.cn/403c370d3d804972ced1038186673fc6_402x431.png) ``` ary.sort(function(a,b){ return a.name.localeCompare(b.name); }) ``` 关于sort实现: sort依据传入的数组不同,选择的算法不同。 ## 求最大值,最小值 1)sort排序法 ``` ary.sort(function(a,b){ return a-b; }) var min = ary[0]; var max= ary[ary.length-1]; ``` 2)`Math.min`需要将要比较的数一个个传递进来,这样才可以得到最后的结果,一下放一个ary数组进来是不可以的 ``` var min = Math.min.apply(null,ary); ``` 或则通过`eval`和字符串拼接 ``` var max = eval(`Math.max(${ary.toString()})`) ``` 3)假设法:假设当前数组中的第一个值是最大值,然后拿这个值和后面的项逐一进行比较,如果后面某一个值比假设的还要大,说明假设错了,我们把假设的值进行替换... ``` var max = ary[0],min=ary[0]; for(var i=1;i<ary.length;++i){ var cur = ary[i]; cur>max?max=cur:null; cur<min?min=cur:null; } ``` ## 求平均数 ``` //去掉最大和最小 function avgFn(){ //->1、 将类数组转换为数组 var ary = Array.prototype.slice.call(arguments) //->2、 给数组排序,去掉开头和结尾,剩下的就是求平均数 ary.sort(function(a,b){ return a-b; }); ary.shift(); ary.pop(); return eval(ary.join("+"))/ary.length.toFixed(2); } //xx.toFixed(n) number类型的方法,保留小数点后n位 ``` ``` function avgFn(){ [].sort.call(arguments,function(a,b){ return a-b; }); [].shift.call(arguments); [].pop.call(arguments); return eval([].join.call(arguments,"+")/arguments.length).toFixed(2) } ``` ## join ### undefined 和 join undefined这一项会直接被忽视,包括属于它的`,` ``` let o = {a:1,b:2,c:3} console.log(o[undefined]) //undefined console.log([undefined,1].join('')) //1 ``` ## forEach **无法跳出循环!** 除了try catch 抛出异常,但显然这没鸟用