objects - mostrar numero mayor javascript
¿Cómo funciona Math.max.apply()? (4)
¿Cómo funciona el Math.max.apply()
?
<!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 código siguiente? Parece que funciona si paso null or Math.
console.log(Math.max.apply(Math,list));
¿Todas las user-defined/Native functions
el user-defined/Native functions
tienen un método de llamada y aplicación que podemos usar?
¿Alguien puede decirme cómo funciona el siguiente código?
Math.max.apply(Math,list)
Math.max
una función Math.max
con el objeto Math
para usar como referencia en la implementación de la función (cuerpo) y la list
para pasar como argumentos.
Así que esto finalmente equivale a
Math.max("12","23","100","34","56", "9","233")
Parece que funciona si paso nulo o matemático.
Obviamente, la implementación Math.max
no usa variables de instancia, no hay ninguna razón para hacerlo. La implementación ingenua simplemente iteraría sobre los arguments
y encontraría el máximo.
¿Todas las funciones nativas / definidas por el usuario tienen un método de llamada y aplicación que podemos usar?
Sí, cada función individual puede invocarse mediante call
o apply
Referencias
-
.apply()
MDN.apply()
(créditos a @RGraham )
Math.max (val1, val2, ...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
son parámetros y deben ser números https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
No puede pasar array
como parámetros Math.max
. Para pasar una matriz, debes usar apply
.
Aplicar
El primer parámetro de apply es this
, el segundo es array
. Los métodos matemáticos son equivalentes a estáticos en otros idiomas, lo que significa que no necesita una instancia de objeto a diferencia de array.prototype.slice
por lo que no es necesario que pase this
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 quiera pasar una matriz como parámetro, debe usar apply
; de lo contrario, use call
.
un pply = un rray
c todo = c omma separado
Más sobre llamar y solicitar
En JavaScript ES6 simplemente use el operador Spread :
var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
// ^^^ Spread operator
apply
acepta una matriz y aplica la matriz como parámetros a la función real. Asi que,
Math.max.apply(Math, list);
se puede entender como,
Math.max("12", "23", "100", "34", "56", "9", "233");
Entonces, apply
es una forma conveniente de pasar una matriz de datos como parámetros a una función. Recuerda
console.log(Math.max(list)); # NaN
no funcionará, porque max
no acepta una matriz como entrada.
Hay otra ventaja, al usar apply
, puedes elegir tu propio contexto. El primer parámetro, que pase para apply
cualquier función, será el que this
dentro de esa función. Pero, max
no depende del contexto actual. Entonces, cualquier cosa funcionaría en lugar de Math
.
console.log(Math.max.apply(undefined, list)); # 233
console.log(Math.max.apply(null, list)); # 233
console.log(Math.max.apply(Math, list)); # 233
Como apply
se define realmente en Function.prototype
, cualquier objeto de función de JavaScript válido tendrá función de apply
, de forma predeterminada.