array

获取数组最值

知识点

  • [x] Math.min(23,41);不接收数组
  • [x] eval:把字符串变成js表达式执行;

    1
    eval("23,43");//-->43 只获取最后一项
  • [x] 括号表达式:(x1,x2,x3,…)获取到的结果只是最后一项;

    1
    2
    3
    4
    5
    6
    7
    function 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(不能接收数组)

    • [ ] 方法一:字符串拼接

      1
      2
      3
      //字符串拼接(将数组中的每一项拼接到这个字符串中)
      "Math.min("+arr.toString()+")"//"Math.min(12,3,34,45,76,9,56)"
      var max=eval("Math.min("+arr.toString()+")");
    • [ ] 方法二:apply()

      1
      2
      3
      4
      //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();排序后,最值分别为首尾相

    1
    2
    var arr=[12,3,34,45,76,9,56];
    arr.sort(function(a,b){return a-b});
  • [x] 假设法:假设当前数组第一个值是最值,第一个值和后面的项逐一比较,假设错了,则把假设值替换

    1
    2
    3
    4
    5
    6
    7
    8
    var 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);
  • 优化原理【将数组转换为数组】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Array.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);
  • 求平均数方法一【将数组转换为数组】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function 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借用数组的方法】

    1
    2
    3
    4
    5
    6
    7
    8
    function 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实现将元素集合、节点集合的类数组转换为数组;

  • 如下实例

    1
    2
    3
    4
    5
    6
    7
    8
    var 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收集代码报错原因

    1
    2
    3
    4
    5
    6
    7
    8
    try{
    //code
    }catch(e){//形参必须写
    //try中代码报错执行catch代码
    console.log(e.message);
    }finally{
    //一般不用:不管try中代码是否报错,都要执行finally中代码
    }
    • [ ] try出现错误,但代码不往下执行

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      try{
      console.log(num);
      }catch(e){
      //手动抛出一条错误信息,终止代码执行
      throw new Error("等待人品添加中……");
      new ReferenceError;//引用错误
      new TypeError;//类型错误
      new RangeError;//范围错误
      }
      console.log("ok");//不想执行此代码
  • [ ] 自创一个公用兼容方法 【将类数组转化为数组】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var 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;
    }
    }