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


    一、最大值和最小值

    1、通过数组的sort方法排序,然后取数组中最后一个,第一个;
    在这里插入图片描述
    2、假设法
    假设数组第一项是最大值,然后通过循环获取数组中的每一项,让数组中的每一项和max进行比较,如果大于max,那么让它当前数组项重新对max进行赋值

    假设数组第一项是最小值,然后通过循环获取数组中的每一项,让数组中的每一项和min进行比较,如果小于min,那么让它当前数组项重新对min进行赋值
    在这里插入图片描述
    如果得到的数比我的基准点小 那么就把当前数赋值给min

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

    3、apply
    利用apply传参的时候 以数组形式 并且形参赋值的时候 其实是也相当于一个一个 与形参对应赋值
    在这里插入图片描述
    在这里插入图片描述
    多位的数组 求最大值 最小值 会返回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
    
    • 1
    • 2
    • 3

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

    二、关于call的应用

    在这里插入图片描述
    类数组求和
    在这里插入图片描述
    将类数组转为数组
    在这里插入图片描述
    将arguments作为slice中this关键字 并且让slice执行
    (slice执行时其实里面操作的就是this)
    (arguments,1,4)从索引1截取到索引4 不包含4—> 45 34 76

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

    三、总结

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

    解决方法一
    先排下序 再掐头去尾
    在这里插入图片描述
    解决方法二
    假设法:先假设一个值 再去验证真假
    先假设第一个是最大假 然后循环数组中的每一项 和假设的值进行比较,
    如果当前遍历的对象 比假设的值大 我们替换假设的值即可在这里插入图片描述
    解决方法三
    能否利用Math.max/Math.min实现我们的需求

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

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

    解决方法四
    apply的特点:虽然编写的是一个数组,但是也相当于在执行函数的时候一项项传递实参
    在这里插入图片描述
    如果想把this保持一致的话 Math.max()<=>Math.max.apply(Math);

    解决方法五
    ES6的展开运算符
    在这里插入图片描述
    求平均数
    去掉一个最高分 去掉一个最低分 剩下的求平均数
    在这里插入图片描述
    优化一
    在这里插入图片描述
    优化二
    在这里插入图片描述
    但是IE浏览器不兼容(IE为了保护原型链 禁止修改原型链)

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

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

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

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

  • 相关阅读:
    STM32中除零运算,为何程序不崩溃?
    彻底了解线程池的原理——40行从零开始自己写线程池
    【Pandas 数据分析3-2】Pandas 数据读取与输出 - Excel
    一些css记录
    每天五分钟计算机视觉:搭建手写字体识别的卷积神经网络
    buuctf_练[羊城杯2020]easyphp
    企业如何利用 Serverless 快速扩展业务系统?
    JavaScript常用工具函数
    java笔试题含答案总结四
    Hadoop的HDFS高可用方案
  • 原文地址:https://blog.csdn.net/qq_39669919/article/details/126164216