类数组转化为数组
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); 利用数组自带的转化方法