一、 简单循环算法

代码如下:

const numbers = [5, 6, 2, 3, 7];
let max = -Infinity; for (let i = 0; i < numbers.length; i++) {
if (numbers[i] > max) max = numbers[i];
}

Infinity

  1. 概述

    全局属性 Infinity 是一个数值,表示无穷大。
  2. 说明
  • Infinity 的初始值是 Number.POSITIVE_INFINITY
  • Infinity(正无穷大)大于任何值。
  • 在 ECMAScript 5 的规范中, Infinity 是只读的。
  1. 示例
    console.log(Infinity          ); /* Infinity */
    console.log(Infinity + 1 ); /* Infinity */
    console.log(Math.pow(10, 1000)); /* Infinity */
    console.log(Math.log(0) ); /* -Infinity */
    console.log(1 / Infinity ); /* 0 */

二、 Math.max()

1. 概述

Math.max() 函数返回作为输入参数的最大数字。

2. 参数

value1, value2, … , valueN

0 个或多个数字,将在其中选择,并返回最大的值。

3. 返回值

给定数值中最大的数。如果任一参数不能转换为数值,则返回 NaN。如果没有提供参数,返回 -Infinity

4. 说明

Math.max.length 是 2,这从某种程度上表明了它旨在处理至少两个参数。

示例:

Math.max(10, 20); //  20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20

5. 比较数组中值的大小

const numbers = [5, 6, 2, 3, 7];
let maxNum = Math.max(...numbers)

展开语法/扩展运算符 ...

  1. 概述

    展开语法 (Spread syntax), 可以在函数调用/数组构造时,将数组表达式或者 string 在语法层面展开;还可以在构造字面量对象时,将对象表达式按 key-value 的方式展开。(字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 这种简洁的构造方式)。
  2. 语法
  • 函数调用:myFunction(...iterableObj);
  • 字面量数组构造或字符串:[...iterableObj, '4', ...'hello', 6];
  • 构造字面量对象时,进行克隆或者属性拷贝:let objClone = { ...obj };

    展开语法和 Object.assign() 行为一致,执行的都是浅拷贝 (只遍历一层)。

三、Function.prototype.apply()

1. 概述

apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。

2. 参数 apply(thisArg, argsArray)

thisArg,在 func 函数运行时使用的 this 值。如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象。

argsArray,可选,一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。

3. 返回值

调用有指定 this 值和参数的函数的结果。

4. 使用

  • 用 apply 将数组各项添加到另一个数组
    array.push.apply(array1, array2);
  • 对于一些需要写循环以遍历数组各项的需求,我们可以用 apply 完成以避免循环。
    const numbers = [5, 6, 2, 3, 7];
    // 使用 Math.min/Math.max 以及 apply 函数时的代码
    let max = Math.max.apply(null, numbers);
    // 基本等同于 Math.max(...numbers)
  • 使用 apply 来链接构造器
    //创建一个全局 Global_Objects/Function 对象的 construct 方法,来使我们能够在构造器中使用一个类数组对象而非参数列表。
    function MyConstructor() {
    for (let nProp = 0; nProp < arguments.length; nProp++) {
    this['property' + nProp] = arguments[nProp];
    }
    }
    let myArray = [4, 'Hello world!', false];
    let myInstance = MyConstructor.construct(myArray); console.log(myInstance.property1); // logs 'Hello world!'
    console.log(myInstance instanceof MyConstructor); // logs 'true'
    console.log(myInstance.constructor); // logs 'MyConstructor'

Object.prototype.constructor

  1. 概述

    constructor 属性返回 Object 的构造函数(用于创建实例对象)。此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。

  2. 说明

    所有对象(使用 Object.create(null) 创建的对象除外)都具有 constructor 属性。

    在没有显式使用构造函数的情况下,创建的对象(例如对象和数组文本)将具有 constructor 属性,这个属性指向该对象的基本对象构造函数类型。

    示例:

    const o = {}
    o.constructor === Object // true
    const a = new Array
    a.constructor === Array // true
    const n = new Number(3)
    n.constructor === Number // true
  3. 使用

  • 打印对象的构造函数
    function Tree(name) {
    this.name = name
    }
    const theTree = new Tree('Redwood')
    console.log('theTree.constructor is ' + theTree.constructor)
  • 改变对象的 constructor:

    可以为除了 null 和 undefined(因为这两者没有相应的构造函数)之外的任何类型指定 constructor 属性(如 String、Number、Boolean 等),但基本类型不会保留这些更改(也不会抛出异常)。
    let val = null;
    val.constructor = 1; // TypeError: val is null val = 'abc';
    val.constructor = Number; // 不报错,但没有改变val.constructor === String
    val.foo = 'bar'; // 创建了一个String('abc')的隐式实例,并为其分配了prop foo
    val.foo === undefined; // true let a = [];
    a.constructor = String
    a.constructor === String // true

5. 与call的区别

call() 接受一个参数列表,而 apply() 接受一个参数的单数组。

四、 Array.prototype.reduce()

1. 概述

reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

2. 参数 reduce(callbackFn, initialValue)

callbackFn,一个“reducer”函数,包含四个参数:

  • previousValue:上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]。
  • currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则为数组索引为 0 的元素 array[0],否则为 array[1]。
  • currentIndex:数组中正在处理的元素的索引。若指定了初始值 initialValue,则起始索引号为 0,否则从索引 1 起始。
  • array:用于遍历的数组。

initialValue 可选

作为第一次调用 callback 函数时参数 previousValue 的值。若指定了初始值 initialValue,则 currentValue 则将使用数组第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组第二个元素。

3. 返回值

使用“reducer”回调函数遍历整个数组后的结果。

4. 示例

const arr = [1, 2, 3];
const max = arr.reduce((a, b) => Math.max(a, b), -Infinity);

五、数组切块后循环传入目标

1. 概述

以上四种方法有超出 JavaScript 引擎参数长度上限的风险。一个方法传入过多参数(比如一万个)时的后果在不同 JavaScript 引擎中表现不同。如果你的参数组非常大,则可以选取这种方法。

JavaScriptCore 引擎中有被硬编码的参数个数上限:65536。

2. 示例

function minOfArray(arr) {
let min = Infinity;
const QUANTUM = 32768; for (let i = 0, len = arr.length; i < len; i += QUANTUM) {
const submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
min = Math.min(submin, min);
}
return min;
}
作者: 唯之为之
链接: https://weizwz.com/posts/b6386794.html
来源: 唯之为之
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

JS比较数值大小的更多相关文章

  1. js获取屏幕大小

    1.js获取屏幕大小 <html> <script> function a(){ document.write( "屏幕分辨率为:"+screen.widt ...

  2. JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内

    /* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...

  3. js改变盒子大小(上下左右)分析

    js改变盒子大小 知识点 三个mouse事件:mousedown mousemove mouseup css的定位和cursor 思路 先解决单边问题识别范围,得到所选区域 event. 根据距离,判 ...

  4. js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内

    /** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...

  5. javaScript中自定义sort中的比较函数,用于比较字符串长度,数值大小

      , 1.2, 'bb', 'cc']; var len = arr.length; // for (var i = 0; i < len; i++) { // alert(arr + &qu ...

  6. js 控制图片大小核心讲解

    控制图片大小的方法有很多,在本文将为大家详细介绍下使用js实现缩放图片,核心代码如下,感兴趣的朋友可以参考下 缩放图片脚本分享 <!DOCTYPE HTML PUBLIC "-//W3 ...

  7. js对数值型数组排序错误

    今天对一个js的数值数组排序,结果发现好像排后的像是对字符数组排的序,后来一查才发现 a = [33,1000]; a.sort(); 结果:1000 33 无论类型,sort方法会调用每个数组项的t ...

  8. js处理数值和日期本地化

    js处理数值和日期本地化 const s = new Intl.NumberFormat('zh-cn'); s.format(111.111) // "111.111" cons ...

  9. C. Jon Snow and his Favourite Number DP + 注意数值大小

    http://codeforces.com/contest/768/problem/C 这题的数值大小只有1000,那么可以联想到,用数值做数组的下标,就是类似于计数排序那样子.. 这样就可以枚举k次 ...

  10. JS时间比较大小

    目录 1. 时间比较 2. 时间戳比较 3. 日期比较方法 4. 参考 1. 时间比较 var curTime = new Date(); //把字符串格式转化为日期类 var starttime = ...

随机推荐

  1. lnmp配置laravel访问环境报错锦集

    1.laravel配置域名访问变成下载,实际就是Nginx没有识别到.php文件.把.php文件的配置加到Nginx即可 .... # 这一段放到项目的Nginx.conf配置文件里面 locatio ...

  2. 一天一道Java面试题----第十二天(如何实现接口幂等性)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.如何实现接口幂等性 1.如何实现接口幂等性 唯一id.每次操作,都根据操作和内容生成唯一的id,在执行之前先判断id是 ...

  3. mybatisPlus在Springboot中的使用

    文章目录 1.简介 2.支持的数据库 3.框架 4.创建一个springboot项目 4.1 .pom文件中加入依赖 4.2.yml文件的配置 4.3 .数据库脚本 4.4.实体类 4.5 .启动类添 ...

  4. 5.pygame快速入门-精灵和精灵组

    在之前案例中,图像加载.位置变化.绘制图像都需要编写代码分别处理 pygame提供了两个类简化开发步骤 pygame.sprite.Sprite #精灵,存储图像数据image和位置rect的对象 p ...

  5. 项目实战:在线报价采购系统(React +SpreadJS+Echarts)

    小伙伴们对采购系统肯定不陌生,小到出差路费.部门物资采购:大到生产计划.原料成本预估都会涉及到该系统. 管理人员可以通过采购系统减少管理成本,说是管理利器毫不过分,对于采购的效率提升也有极大帮助. 但 ...

  6. 浅入浅出 1.7和1.8的 HashMap

    前言 HashMap 是我们最最最常用的东西了,它就是我们在大学中学习数据结构的时候,学到的哈希表这种数据结构.面试中,HashMap 的问题也是常客,现在卷到必须答出来了,是必须会的知识. 我在学习 ...

  7. apijson 初探

    apijson 初探 本文试着用 5W1H 方式切入,试图快速建立自己对 apijson 的整体认知,所以这不是一趟快速入门的 demo 之旅,而是显得比较务虚的探索式知识体系整合过程. 持续更新中. ...

  8. Pyhton基础部分:6、与用户交互、基础运算符

    目录 一.python数据类型 1.布尔值bool 2.元组tuple 3.集合set 二.与用户交互 1.获取用户输入 2.输出内部信息 3.语言环境差异 三.格式化输入 1.代码实现 2.注意事项 ...

  9. ES6 学习笔记(一)let、const与作用域

    一.let命令 1.1用法 1.1.1 let类似于var,但所声明的变量只在let命令所在的代码块有效. 如: { let a = 10 var b = 20 } console.log(b) co ...

  10. java判断手机号三大运营商归属的工具类

    package com.tymk.front.third; import java.util.regex.Pattern; public class OperatorsUtil { /** * 中国电 ...