乐趣区

关于javascript: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];
}

Infinity

  1. 概述
    全局属性 Infinity 是一个数值,示意无穷大。
  2. 阐明

    • Infinity 的初始值是 Number.POSITIVE_INFINITY
    • Infinity(正无穷大)大于任何值。
    • 在 ECMAScript 5 的标准中,Infinity 是只读的。
  3. 示例

    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;
}
退出移动版