JS比较数值大小

js,比较,数值,大小 · 浏览次数 : 423

小编点评

**一、简单循环算法代码** ```javascript 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]; } console.log(max); ``` **二、 Math.max() 函数** ```javascript const numbers = [5, 6, 2, 3, 7]; const max = Math.max(...numbers); console.log(max); ``` **三、 Function.prototype.apply()** ```javascript const numbers = [5, 6, 2, 3, 7]; const max = Math.max.apply(null, numbers); console.log(max); ``` **四、 Array.prototype.reduce()** ```javascript const arr = [1, 2, 3]; const max = arr.reduce((a, b) => Math.max(a, b), -Infinity); console.log(max); ``` **五、 数组切块后循环** ```javascript 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; } ```

正文

一、 简单循环算法

代码如下:

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;
}

与JS比较数值大小相似的内容:

JS比较数值大小

一、 简单循环算法 代码如下: 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

好用到飞起的新项目「GitHub 热点速览」

虽然本周 GitHub 热榜都是一些熟悉的面孔,但还是有不少新开源的项目,比如受启发于 Stripe IDs 的 UUIDv7 扩展 typeid,相信有了它,数据标识问题就迎刃而解了。此外,还有刚开源就获得近 2k star 的抠背景项目 background-removal-js,一键就能去掉图片背景。

本地JS文件批量压缩

最近在维护一个小后台项目,有段JS需要压缩上传到CDN存储服务器。由于之前压缩的JS文件都比较少,都是手动压缩的。这次需要压缩的文件比较多,所以用了批量压缩。特此记录一下,方便大家和自己以后再用到的时候备忘。 v准备工作 安装nodejs 首先在本地安装node.js和npm,一般npm集成于nod

js 中常用函数汇总(含示例)

js 在日常开发中还是比较常用的,本文将常用的 js 方法简单汇总一下,并附带了示例,可自行测试。

js 关于 replace 取值、替换第几个匹配项(两种方式:正则、普通字符串操作)

在日常开发中,经常遇到针对字符串的替换、截取,知识点比较碎容易混淆,特此总结一下,仅供参考。

Nuxt.js 生成sitemap站点地图文件

Nuxt.js 生成sitemap站点地图文件 背景介绍 ​ 使用nuxt框架生成静态文件支持SEO优化,打包之后需要生成一个 sitemap.xml 文件方便提交搜索引擎进行收录。官网有提供一个插件sitemap 但是如果是动态路由需要手动一个个配置比较麻烦,无法自动检索生成。所以自己编写一个生成

使用js开发一个快速打开前端项目的alfred插件

使用js开发一个快速打开前端项目的插件 目录 前言 使用的技术栈 步骤 问题发现 待优化 前言 一直以来开发都是先打开vscode,然后选择项目,在项目多的情况下会觉得挺繁琐;如果同时打开了许多vscode窗口,寻找目标窗口也比较麻烦,于是萌生了开发一个alfred的工作流插件的想法,目标是在alf

nodejs 入门基本概念

nodejs 的诞生 Node.js 是2009的时候由大神 Ryan Dahl 开发的。Ryan 的本职工作是用 C++ 写服务器,后来他总结出一个经验,一个高性能服务器应该是满足“事件驱动,非阻塞 I/O”模型的。C++ 开发起来比较麻烦,于是 Ryan 就想找一种更高级的语言,以便快速开发。

vue的两种服务器端渲染方案

关于服务器端渲染方案,之前只接触了基于react的Next.js,最近业务开发vue用的比较多,所以调研了一下vue的服务器端渲染方案。本文着重介绍两种渲染方案。

安装node-sass失败原因及解决办法汇总

node-sass 安装过程 npm 拉下 node-sass包; 根据node版本和node-sass版本拉取对应的binding.node编译器,原因是sass的编译语言比较特殊,需要下载对应版本的编译器才能编译;(node scripts/install.js 阶段) 如果能拉下binding