获取数组最值
知识点
- [x] Math.min(23,41);不接收数组
[x] eval:把字符串变成js表达式执行;
1eval("23,43");//-->43 只获取最后一项
[x] 括号表达式:(x1,x2,x3,…)获取到的结果只是最后一项;
1234567function fn1(){console.log(this);}function fn2(){console.log(this);}var obj={fn:fn2};(fn2,obj.fn)();//->只执行的是obj.fn,但是只是将内容复制过来了,this->window而不是obj(obj.fn)();//只有一项时,this->obj
思路
[x] Math.min或Math.min(不能接收数组)
[ ] 方法一:字符串拼接
123//字符串拼接(将数组中的每一项拼接到这个字符串中)"Math.min("+arr.toString()+")"//"Math.min(12,3,34,45,76,9,56)"var max=eval("Math.min("+arr.toString()+")");[ ] 方法二:apply()
1234//apply以数组的形式传参var arr=[12,3,34,45,76,9,56];var max=Math.max.apply(null,ary);var max=Math.min.apply(null,ary);
[x] sort();排序后,最值分别为首尾相
12var arr=[12,3,34,45,76,9,56];arr.sort(function(a,b){return a-b});[x] 假设法:假设当前数组第一个值是最值,第一个值和后面的项逐一比较,假设错了,则把假设值替换
12345678var arr=[12,3,34,45,76,9,56];var max=arr[0];min=arr[0];for(var i=0;i<arr.length;i++){var cur=arr[i];cur>max?max=cur:null;cur<min?min=cur:null;}console.log(max,min);
获取数组平均值
知识点
- [x] argument.sort() ; //报错,因为argument是类数组,不是真的数组
- [x] 怎样将类数组转化为数组。将函数传递的参数arguments类数组的值复制到新数组
- [ ] var arr=Array.prototype.slice.call(arguments)
- [ ] var arr=[].slice.call(arguments);
优化原理【将类数组转换为数组】
123456789101112131415161718Array.prototype.mySlice=function(){//内置复制一个数组的代码//借用数组原型上slice方法,让slice执行时,让方法中的this变为我要处理的arguments,实现将类数组arguments转换为数组var arr=[];for(var i=0;i<this.length;i++){arr[arr.length]=this[i];}//自己写的将arguments转换为数组的代码var arr=[];for(var i=0;i<arguments.length;i++){arr[arr.length]=arguments[i];}return this;}var arr=[12,3,4];var newarr=arr.mySlice();console.log(newarr);求平均数方法一【将类数组转换为数组】
123456789101112131415161718function avg(){//1、将**类**数组转换为数组// var arr=[];// for(var i=0;i<arguments.length;i++){// arr[arr.length]=arguments[i];// }//1、优化【将**类**数组复制转换为数组】var arr=Array.prototype.slice.call(arguments)var arr=[].slice.call(arguments);//同上,先找实例上没有slice方法,往上找到原型有slice方法;//2、数组排序,去头去尾,剩下求平均数 arr.sort(function(a,b){return a-b});arr.shift();arr.pop();return (eval(ary.join("+"))/arr.length).toFixed(2);}var re=avg(12,23,34,34.5,65.0,6.1);console.log(re);求平均数二【直接让类数组arguments借用数组的方法】
12345678function avg(){[].sort.call(arguments,function(a,b){return a-b});[].shift.call(arguments);[].pop.call(arguments);return (eval([].join.call(arguments,"+"))/arguments.length).toFixed(2);}var re=avg(12,23,34,34.5,65.0,6.1);console.log(re);
类数组转换为数组
知识点
[x] HTMLCollection元素集合类、NodeList节点集合类的一个实例(类数组集合)
[x] arguments借用数组的方法不存在兼容问题
[x] 在IE6~8不兼容,不支持借用数组slice实现将元素集合、节点集合的类数组转换为数组;
如下实例
12345678var olist=document.getElementsByTagName("div");//->标准var arr=[].slice.call(olist);console.log(arr);//->非标准(将类数组转换为数组)for(var i=0;i<olist.length;i++){arr[arr.length]=olist[i];}[x] 异常捕获e.message收集代码报错原因
12345678try{//code}catch(e){//形参必须写//try中代码报错执行catch代码console.log(e.message);}finally{//一般不用:不管try中代码是否报错,都要执行finally中代码}[ ] try出现错误,但代码不往下执行
12345678910try{console.log(num);}catch(e){//手动抛出一条错误信息,终止代码执行throw new Error("等待人品添加中……");new ReferenceError;//引用错误new TypeError;//类型错误new RangeError;//范围错误}console.log("ok");//不想执行此代码
[ ] 自创一个公用兼容方法 【将类数组转化为数组】
12345678910111213var utils={listToArray:function(likeArray){var arr=[];try{arr=[].slice.call(likeArray);}catch(e){for(var i=0;i<likeArray.length;i++){arr[arr.length]=likeArray[i];}}return arr;}}