你的位置:首页 > Java教程

[Java教程]求平均数


求平均数的代码
function avgFn() {
首先把arguments转化为数组
var ary = [];
for (var i = 0; i < arguments.length; i++) {
ary.push(arguments[i]);
ary[ary.length] = arguments[i];
}
数组排序
ary.sort(function (a, b) {
return a - b;
});
掐头去尾
ary.unshift();
ary.pop();
求和求平均值,小数保留两位值
eval() 把字符串转化成JS表达式供我们使用
return (eval(ary.join("+"))/ary.length).toFixed(2);
}
var res = avgFn(2, 9, 0, 4, 5);
console.log(res);

*********************************************
arguments.sort进行排序的时候报了一个错误:arguments.sort is not a function ?
sort是Array这个内置类原型上的一个方法,只有Array的实例(数组)才能使用这些方法,而arguments虽然长得像数组但是不是数组(类数组),arguments不是Array这个类的一个实例,所以不能直接的使用sort方法...
console.log(arguments instanceof Array);//->false
如何把类数组转换成数组
模拟数组的slice方法实现最简单的操作:数组的克隆
Array.prototype.slice = function () {
var ary = [];
数组的slice就是这样实现克隆的
for (var i = 0; i < this.length; i++) {
ary[ary.length] = this[i];//->ary.push(this[i]);
}
把arguments转换为数组
for (var i = 0; i < arguments.length; i++) {
ary[ary.length] = arguments[i];
}
return ary;
};
[12, 23, 34].slice();
规律:虽然arguments不是数组,但是它是类数组,也就是相关的操作其实和数组非常的相似,比如循环等都比较相似;对比上述的代码我们发现,内置slice中实现克隆的代码和我们把 arguments转换为数组的代码基本一样,只不过上边用的是this,而下边用的是argumnets;换句话说是要让slice执行的时候,里面的this变为arguments,就相当于我们把arguments转换为数组;!!!slice(start,end)从已有的数组中返回指定的元素( 前面包含 后面不包含)

function avgFn() {
借用数组的slice方法实现将类数组转换为数组
var ary = Array.prototype.slice.call(arguments, 0);
//var ary=[].slice.call(arguments,0);
ary.sort(function (a, b) {
return a - b;
});
ary.shift();
ary.length--;
return (eval(ary.join("+")) / ary.length).toFixed(2);
}

var res = avgFn(2, 9, 0, 4, 5);
console.log(res);
第二种思想:直接的操作arguments
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);
}
var res = avgFn(2, 9, 0, 4, 5);
console.log(res);
*********************************************************8
var oList = document.getElementsByTagName("div");//获取的是一个元素的集合也是一个类数组

兼容的话使用下面的代码
var ary = Array.prototype.slice.call(oList, 0);

不兼容的话自己使用for循环处理
for (var i = 0; i < oList.length; i++) {
ary[ary.length] = oList[i];
}

function fn() {
console.log(Array.prototype.slice.call(arguments, 0));
}
fn(100, 200, 300)

借用数组原型上的slice方法把我们的类数组转化为数组,对于arguments来说兼容所有的浏览器,但是对于DOM元素/节点集合来说在IE6~8不兼容