Как 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
Приведенный выше код находит максимальное число в списке. Может ли кто-нибудь сказать мне, как работает приведенный ниже код ?. Кажется, это работает, если я пройдуnull or Math.
console.log(Math.max.apply(Math,list));
Есть ли у всех метод user-defined/Native functions
вызова и применения, который мы можем использовать?
источник
undefined
илиnull
:) Если бы выmax
попытались получить доступ / изменить что-либо в контексте, это не удалось бы, если для контекста установлено значениеundefined
илиnull
.Math.max
не будет использовать первый параметр, поскольку ему не нужен контекст. Он работает только с данными, которые он получает в аргументах.this
будет хорошей отправной точкой. Она также имеет раздел ,call
иapply
в котором подробно это.В JavaScript ES6 просто используйте оператор Spread :
var list = ["12","23","100","34","56","9","233"]; console.log(Math.max(...list)); // ^^^ Spread operator
источник
Math.max.apply(Math,list)
Вызывает
Math.max
функцию сMath
объектом, который будет использоваться в качествеthis
ссылки в реализации функции (теле) иlist
передаваться в качестве аргументов.Таким образом, это в конечном итоге равно
Math.max("12","23","100","34","56", "9","233")
Очевидно, что
Math.max
реализация не использует переменную экземпляра - для этого нет причин. Собственная реализация просто перебираетarguments
и находит максимальное значение.Да, каждую функцию можно вызвать с помощью
call
илиapply
Рекомендации:
.apply()
Документация MDN (кредиты @RGraham )источник
Я начну с того ,
Math.max(...numbers)
иFunction.prototype.apply()
должны использоваться только для массивов с относительно небольшим числом элементов. (...) и apply либо завершится ошибкой, либо вернет неправильный результат, если массив слишком великMath.max.apply(null | undefined | Math, numbers)
то же самое, чтоMath.max(...numbers)
я бы рекомендовалMath.max(...numbers)
по эстетическим соображениям.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
Если вам нужно найти максимальный элемент в числовом массиве, который очень велик: используйте
Array.reduce()
метод.Array.reduce()
может использоваться для поиска максимального элемента в числовом массиве путем сравнения каждого значения: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)
Заключение:
Относительно небольшой числовой массив: используйте
Math.max(...numbers)
числовой массив: используйте очень большой числовой массив: используйтеArray.reduce()
методисточник
Math.max (значение1, значение2, ...)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
являются параметрами и должны быть числами MDN Math.maxВы не можете передавать в
array
качествеMath.max
параметров. Чтобы передать массив, вы должны использоватьapply
.Применять
Первый параметр apply -
this
это второйarray
. Математические методы эквивалентны статическим в других языках, что означает, что в отличие от них не требуется экземпляр объекта,array.prototype.slice
поэтому вам не нужно передаватьthis
в этом случае .пример
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)
Если вы хотите передать массив в качестве параметра, который вы должны использовать
apply
, в противном случае используйтеcall
.a pply = a rray
c all = c omma separated
Подробнее о вызове и применении
источник