类数组转化为数组

2019-07-30  本文已影响0人  没了提心吊胆的稗子
// 求平均数
    function avgFn(){
        // 将类数组转化为数组
        var ary = [];
        for (var i = 0; i < arguments.length; i++) {
            ary[ary.length] = arguments[i];
        }
        ary.sort(function (a, b) {
            return a - b;
        });
        // 删除排序后的第一个和最后一个
        ary.shift();
        ary.pop();
        return (eval(ary.join('+')) / ary.length).toFixed(2);
    }

模拟内置slice实现数组克隆

Array.prototype.mySlice = function () {
       var ary = [];
       for (var i = 0; i < this.length; i++) {
           ary[ary.length] = this[i];
       }
       return ary;
   };

优化类数组转数组的代码:借用数组原型上的slice方法,将arguments转化为数组

function avgFn(){
        // 将类数组转化为数组
        Array.prototype.slice.call(arguments);
        // same as
        [].slice.call(arguments);
    }

换一种思路:不转化成数组,直接对arguments排序,借用数组原型上的方法

function avgFn1() {
        [].sort.call(arguments, function (a, b) {
            return a - b;
        });
        [].shift.call(arguments);
        [].pop.call(arguments);
        return (eval([].join.call(arguments, '+')) / arguments.length).toFixed(2);
    }
// 两个都是类数组集合
// 获取到的是元素集合HTMLCollection
document.getElementByTagName()
// 获取到的是节点集合NodeList
document.getElementByName()

IE6-8不支持借用数组的slice方法将元素/节点集合转化为数组,但是arguments可以,不兼容时就需要自己写for循环
使用浏览器异常信息捕获检测兼容与否,try..catch..
JS中任意一行代码出错,就会停止后面代码的执行,但在try..catch..中,异常捕获之后,不会影响下面代码的执行。若try中代码执行出错,会默认执行catch中的代码,e.message可以收集报错原因

// 完整写法:
try{
  // js code
}catch(e){
  // try中代码出错则会执行这里面的代码
}finally{
  // 不管try中的代码是否报错,这里面的代码都会执行
}

若不想出错之后继续执行后面的代码,则可以在catch中手动抛出一条错误信息

try{
  // js code
}catch(e){
  throw new Error('啊哦~出错咯!!!');
}

错误类型
new ReferenceError -> 引用错误
new TypeError -> 类型错误
new RangeError -> 范围错误

// 兼容的类数组转换方法
var utils = {
    listToArray: function (likeArray) {
        var ary = [];
        try {
            ary = ary.slice.call(likeArray);
        } catch(e) {
            for (var i = 0; i < likeArray.length; i++) {
                ary[ary.length] = likeArray[i];
            }
        }
        return ary;
    }
};

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
Array.from(arguments); 利用数组自带的转化方法

上一篇 下一篇

猜你喜欢

热点阅读