¿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 functions
tienen el método de llamada y aplicación que podemos usar?
fuente
undefined
onull
:) Simax
intentamos acceder / cambiar algo en el contexto, habría fallado cuando el contexto está configurado enundefined
onull
.Math.max
no usará el primer parámetro, ya que no necesita ningún contexto. Opera solo sobre los datos que recibe en los argumentos.this
sería un buen punto de partida. También tiene una seccióncall
yapply
que 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 operator
fuente
Math.max.apply(Math,list)
Invoca una
Math.max
función conMath
objeto para utilizarla comothis
referencia en la implementación de la función (cuerpo) ylist
pasarla como argumentos.Entonces esto eventualmente equivale a
Math.max("12","23","100","34","56", "9","233")
Obviamente, la
Math.max
implementación no usa la variable de instancia, no hay razón para hacerlo. La implementación nativa simplemente iteraríaarguments
y encontraría la máxima.Sí, todas las funciones se pueden invocar usando
call
oapply
Referencias:
.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: 2
Si 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
array
comoMath.max
pará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.slice
por lo que no necesita pasarthis
en 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