js基础知识整理之 —— 求最大值 最小值 平均数的几种方法

一、最大值和最小值

1、通过数组的sort方法排序,然后取数组中最后一个,第一个;
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第1张图片
2、假设法
假设数组第一项是最大值,然后通过循环获取数组中的每一项,让数组中的每一项和max进行比较,如果大于max,那么让它当前数组项重新对max进行赋值

假设数组第一项是最小值,然后通过循环获取数组中的每一项,让数组中的每一项和min进行比较,如果小于min,那么让它当前数组项重新对min进行赋值
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第2张图片
如果得到的数比我的基准点小 那么就把当前数赋值给min

三元运算符的方法
cur>max? max=cur:null;
cur

3、apply
利用apply传参的时候 以数组形式 并且形参赋值的时候 其实是也相当于一个一个 与形参对应赋值
在这里插入图片描述
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第3张图片
多位的数组 求最大值 最小值 会返回NaN

var ary=[1,3,6,88,66,37,29];
console.log(Math.min.apply(null,ary));//--->1  
console.log(Math.max.apply(null,ary));//--->88

本来Math是不能这样取值的 但是通地用可以apply让它实现 Math.min和apply结合 取最大最小值

二、关于call的应用

js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第4张图片
类数组求和
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第5张图片
将类数组转为数组
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第6张图片
将arguments作为slice中this关键字 并且让slice执行
(slice执行时其实里面操作的就是this)
(arguments,1,4)从索引1截取到索引4 不包含4—> 45 34 76

类数组转数组 笨方法
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第7张图片
需求:去掉最大值 最小值 取平均数
取一组数的平均数
arguments 函数天生自带的参数集合,通过arguments获取传进来的参数
arguments是类数组 它身上没 数组才有sort方法
所以要把类数组转化为数组,可以用sort排序 再用pop删除最后一项(也就是最大值 )
shift删除第一项(最小值)
把数组中的每一项相加求和,然后除以数组的length
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第8张图片
求平均分
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第9张图片
将元素集合 通过call方法使用数组的slice方法 发现在IE6~8是不兼容
类数组转化为数组 (谁兼容优先谁)
var newArr = [ ].slice.call(oList, 0); 不兼容

三、总结

求最大值 和 最小值和几种方法

解决方法一
先排下序 再掐头去尾
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第10张图片
解决方法二
假设法:先假设一个值 再去验证真假
先假设第一个是最大假 然后循环数组中的每一项 和假设的值进行比较,
如果当前遍历的对象 比假设的值大 我们替换假设的值即可js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第11张图片
解决方法三
能否利用Math.max/Math.min实现我们的需求

Math.max([10, 23, 45, 67, 12, 89])==>NaN
Math.max(10, 23, 45, 67, 12, 89)==>89

执行MAX方法,我们需要把比较一堆数值一项项的传递给这个方法才可以传递一个数组整体是不行的
第一次尝试 [10, 23, 45, 67, 12, 89].toString(); “10, 23, 45, 67, 12, 89”
再eval(“10, 23, 45, 67, 12, 89”)===>89 只有最后一项
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第12张图片
真实项目当中 尽量减少eval的使用 防止代码压缩成为一行后 eval导致代码结构或者执行混乱
Math.max.apply(Math,ary) 利用apply的特征
Math.max(…ary) 使用es6的展开运算符:把ary中的第一项展开(类似于一个个的传递给方法)

解决方法四
apply的特点:虽然编写的是一个数组,但是也相当于在执行函数的时候一项项传递实参
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第13张图片
如果想把this保持一致的话 Math.max()<=>Math.max.apply(Math);

解决方法五
ES6的展开运算符
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第14张图片
求平均数
去掉一个最高分 去掉一个最低分 剩下的求平均数
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第15张图片
优化一
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第16张图片
优化二
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第17张图片
但是IE浏览器不兼容(IE为了保护原型链 禁止修改原型链)

优化三
类数组转数组
借用数组原型上的slice方法,实现将类数组转换为数组 <===学名
原理 :执行数组原型上的slice方法,让方法中的this指向要转换的类数组,这样在执行内置代码的时候 ,this已经变成arguments 相当于在操作arguments
js基础知识整理之 —— 求最大值 最小值 平均数的几种方法_第18张图片
前提条件:必须是类数组才可以,因为类数组虽然不是数组,但是它的结构和数组基本上类似,也就是操作数组的那些循环判断等js语句,同样也又能操作arguments这种类数组;

类数组不仅可以借用slilce
Array原型上的大部分方法都可以借来使用(原理都是this改变)
在这里插入图片描述
在借用数组原型上的方法把类数组转换为数组的时候
在IE低版本浏览器中(IE6~8)arguments可以转换 但是元素集合或节点集合这些类数组是无法借用

slice转换的 报错:Array.prototype.slice:"this"不是javascript对象
但是arguments这个类数组在所有浏览器中使用上述办法转换为数组都兼容,只有元素集合或者节点集合这种类数组才不兼容低版本浏览器

类数组和数组的区别:
因为类数组不是Array的实例,不能直接调取Array.prototype的方法

你可能感兴趣的:(js,javascript,前端)