¿Cómo Math.max.apply()funciona ?.
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <script>
      var list = ["12","23","100","34","56",
                                    "9","233"];
      console.log(Math.max.apply(Math,list));    
  </script>
</body>
</html>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
El código anterior encuentra el número máximo en la lista. ¿Alguien puede decirme cómo funciona el siguiente código? Parece que funciona si pasonull or Math. 
console.log(Math.max.apply(Math,list));
¿Todos user-defined/Native functionstienen el método de llamada y aplicación que podemos usar?
fuente

undefinedonull:) Simaxintentamos acceder / cambiar algo en el contexto, habría fallado cuando el contexto está configurado enundefinedonull.Math.maxno usará el primer parámetro, ya que no necesita ningún contexto. Opera solo sobre los datos que recibe en los argumentos.thissería un buen punto de partida. También tiene una seccióncallyapplyque detalla esto.En JavaScript ES6 simplemente use el operador Spread :
var list = ["12","23","100","34","56","9","233"]; console.log(Math.max(...list)); // ^^^ Spread operatorfuente
Math.max.apply(Math,list)Invoca una
Math.maxfunción conMathobjeto para utilizarla comothisreferencia en la implementación de la función (cuerpo) ylistpasarla como argumentos.Entonces esto eventualmente equivale a
Math.max("12","23","100","34","56", "9","233")Obviamente, la
Math.maximplementación no usa la variable de instancia, no hay razón para hacerlo. La implementación nativa simplemente iteraríaargumentsy encontraría la máxima.Sí, todas las funciones se pueden invocar usando
calloapplyReferencias:
.apply()Documentación de MDN (créditos a @RGraham )fuente
Comenzaré diciendo
Math.max(...numbers)yFunction.prototype.apply()solo debería usarse para matrices con relativamente pocos elementos. (...) aplicar fallará o devolverá el resultado incorrecto si la matriz es demasiado grandeMath.max.apply(null | undefined | Math, numbers)es lo mismo queMath.max(...numbers)yo recomendaríaMath.max(...numbers)por razones estéticas.const numbers = [5, 6, 2, 3, 7]; const max = Math.max(...numbers); console.log('max:', max); // expected output: 7 const min = Math.min(...numbers); console.log('min:', min); // expected output: 2Si necesita encontrar el elemento máximo en una matriz numérica que es muy grande: use el
Array.reduce()método.Array.reduce()se puede utilizar para encontrar el elemento máximo en una matriz numérica, comparando cada valor:const numbers = [5, 6, 2, 3, 7]; const getMax = (numbers) => numbers.reduce((a, b) => Math.max(a, b)); const getMin = (numbers) => numbers.reduce((a, b) => Math.min(a, b)); const max = getMax(numbers) const min = getMin(numbers) console.log('max:', max) console.log('min:', min)Conclusión:
Matriz numérica que es relativamente pequeña: use una
Math.max(...numbers)matriz numérica que sea muy grande: use elArray.reduce()métodofuente
Math.max (val1, val2, ...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])value1, value2...son parámetros y deben ser Numbers MDN Math.maxNo puede pasar
arraycomoMath.maxparámetros. Para pasar una matriz tienes que usarapply.Aplicar
El primer parámetro de aplicar es
this, el segundo esarray. Los métodos matemáticos son equivalentes a estáticos en otros lenguajes, lo que significa que no necesita una instancia de objeto a diferencia de,array.prototype.slicepor lo que no necesita pasarthisen este caso.Ejemplo
var arr = [1, 2, 3]; Math.max(1, 2, 3); // -> 3 Math.max(arr); // -> NaN (Not a Number) Math.max.apply(null, arr); // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3 arr.slice(1); // -> returns Array [2, 3] Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)Cuando desee pasar una matriz como parámetro, debe usar
apply, de lo contrario, usecall.a pply = a rray
c all = c omma separados
Más sobre llamar y aplicar
fuente