Мне действительно интересно, как эти функции действительно работают? Я знаю, что есть много вопросов о том, как их использовать, я уже знаю, как их использовать, но я не мог найти нигде, как фактически реализовать эту функцию в массиве, например, если таких функций не было ? Как бы вы закодировали такую функцию, если не было помощников?Как работает Javascript Math.max и Math.min?
ответ
Основные функциональные возможности:
Math.max() и Math.min() используются на номера (или то, что они могут принуждать в номера) вы не можете напрямую передать массив в качестве параметра.
Ex:
Math.max(1,52,28)
Вы можете иметь несколько разделенных запятыми чисел.
Массивы:
Этот пример показывает, как можно было бы применить их к массивам:
JavaScript: min & max Array values?
В основном следующие работы:
Math.max.apply(null, [1,5,2,3]);
Почему это работает ?
Это работает, потому что apply - это функция, которая имеет все функции, которая применяет функцию с аргументами массива.
Math.max.apply (нуль, [1,5,2,3]) такая же, как Math.max (1,5,2,3)
Не забывайте, что он также работает с объектами, которые имеют те же свойства, что и массив: 'Math.max.apply (null, {0: 1,1: 4,2: 2, length: 3})' – ahitt6345
@ ahitt6345 Это хороший момент; и это может быть полезно. конечно, вам нужно будет выполнить Math.functionname.apply (null, obj); Я просто хотел указать это на случай, если кто-то задается вопросом, почему именно копирование не сработало. – csga5000
кричит, забыл о функции, которую я хотел применить ... спасибо, что рассказал мне. : | lol – ahitt6345
Вот код Math.max в Двигатель Chrome V8.
function MathMax(arg1, arg2) { // length == 2
var length = %_ArgumentsLength();
if (length == 2) {
arg1 = TO_NUMBER(arg1);
arg2 = TO_NUMBER(arg2);
if (arg2 > arg1) return arg2;
if (arg1 > arg2) return arg1;
if (arg1 == arg2) {
// Make sure -0 is considered less than +0.
return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg2 : arg1;
}
// All comparisons failed, one of the arguments must be NaN.
return NaN;
}
var r = -INFINITY;
for (var i = 0; i < length; i++) {
var n = %_Arguments(i);
n = TO_NUMBER(n);
// Make sure +0 is considered greater than -0.
if (NUMBER_IS_NAN(n) || n > r || (r === 0 && n === 0 && %_IsMinusZero(r))) {
r = n;
}
}
return r;
}
Here является хранилищем.
Собственно, [он находится в JavaScript] (https://github.com/v8/v8/blob/cd81dd6d740ff82a1abbc68615e8769bd467f91e/src/js/math.js#L77-L102). –
Спасибо. Я отредактирую ответ. –
Это легко реализовать с помощью Array.prototype.reduce
:
function min() {
var args = Array.prototype.slice.call(arguments);
var minValue = args.reduce(function(currentMin, nextNum) {
if (nextNum < currentMin) {
// nextNum is less than currentMin, so we return num
// which will replace currentMin with nextNum
return nextNum;
}
else {
return currentMin;
}
}, Infinity);
return minValue;
}
Вам не нужно сначала нарезать; вы можете просто сделать 'Array.prototype.reduce.call'. –
Ниже, как реализовать функции, если Math.min()
и Math.max()
сделал не существует.
Функции имеют объект arguments
, который вы можете прокручивать, чтобы получить его значения.
Важно отметить, что Math.min()
без аргументов возвращает Infinity
и Math.max()
без аргументов возвращает -Infinity
.
function min() {
var result= Infinity;
for(var i in arguments) {
if(arguments[i] < result) {
result = arguments[i];
}
}
return result;
}
function max() {
var result= -Infinity;
for(var i in arguments) {
if(arguments[i] > result) {
result = arguments[i];
}
}
return result;
}
//Tests
console.log(min(5,3,-2,4,14)); //-2
console.log(Math.min(5,3,-2,4,14)); //-2
console.log(max(5,3,-2,4,14)); //14
console.log(Math.max(5,3,-2,4,14)); //14
console.log(min()); //Infinity
console.log(Math.min()); //Infinity
console.log(max()); //-Infinity
console.log(Math.max()); //-Infinity
Ну вот min
без Math.min
(код в ES6).
function min() {
return Array.from(arguments).reduce(
(minSoFar, next) => minSoFar < next ? minSoFar : next
, Infinity)
}
Та же логика может быть реализована с помощью простого цикла. Вам просто нужно будет отслеживать одну из переменных через вашу итерацию, которая является самым низким значением, которое вы видели до сих пор. Начальным значением minSoFar
будет Infinity
. Причина заключается в том, что любой Число кроме Infinity
меньше Infinity
, но в случае не аргументов посланных, мы хотим вернуть Infinity
себя, потому что это то, что Math.min()
без аргументов имеет значение.
function min() {
let minSoFar = Infinity
for(let i = 0, l = arguments.length; i < l; i++) {
const next = arguments[i]
minSoFar = minSoFar < next ? minSoFar : next
}
return minSoFar
}
Max
может быть реализован с почти той же логикой, только вы отслеживание самого высокого значения, которое вы видели до сих пор, и начальное значение -Infinity
. (!, Который может/должен помочь вам в реализации)
Давайте посмотрим на спецификации
В ECMAScript 1st Edition (ECMA-262) (первоначальные определения как для Math.max/мин), мы видим следующее:
15.8.2.11 max(x, y)
Returns the larger of the two arguments.
• If either argument is NaN, the result is NaN.
• If x>y, the result is x.
• If y>x, the result is y.
• If x is +0 and y is +0, the result is +0.
• If x is +0 and y is −0, the result is +0.
• If x is −0 and y is +0, the result is +0.
• If x is −0 and y is −0, the result is −0.
15.8.2.12 min(x, y)
Returns the smaller of the two arguments.
• If either argument is NaN, the result is NaN.
• If x<y, the result is x.
• If y<x, the result is y.
• If x is +0 and y is +0, the result is +0.
• If x is +0 and y is −0, the result is −0.
• If x is −0 and y is +0, the result is −0.
• If x is −0 and y is −0, the result is −0.
Более поздние версии спецификации дают нам:
15.8.2.11 max ([ value1 [ , value2 [ , … ] ] ])
Given zero or more arguments, calls ToNumber on each of the arguments and returns the largest of the resulting values.
• If no arguments are given, the result is −∞.
• If any value is NaN, the result is NaN.
• The comparison of values to determine the largest value is done as in 11.8.5 except that +0 is considered to be larger than −0.
The length property of the max method is 2.
15.8.2.12 min ([ value1 [ , value2 [ , … ] ] ])
Given zero or more arguments, calls ToNumber on each of the arguments and returns the smallest of the resulting values.
• If no arguments are given, the result is +∞.
• If any value is NaN, the result is NaN.
• The comparison of values to determine the smallest value is done as in 11.8.5 except that +0 is considered to be larger than −0.
The length property of the min method is 2.
Ссылки на раздел 11.8.5 можно найти здесь: The Abstract Relational Comparison Algorithm
20.2.2.24 Math.max (value1, value2 , …values)
Given zero or more arguments, calls ToNumber on each of the arguments and returns the largest of the resulting values.
• If no arguments are given, the result is −∞.
• If any value is NaN, the result is NaN.
• The comparison of values to determine the largest value is done using the Abstract Relational Comparison algorithm (7.2.11) except that +0 is considered to be larger than −0.
The length property of the max method is 2.
20.2.2.25 Math.min (value1, value2 , …values)
Given zero or more arguments, calls ToNumber on each of the arguments and returns the smallest of the resulting values.
• If no arguments are given, the result is +∞.
• If any value is NaN, the result is NaN.
• The comparison of values to determine the smallest value is done using the Abstract Relational Comparison algorithm (7.2.11) except that +0 is considered to be larger than −0.
The length property of the min method is 2.
И снова, 7.2.11 можно найти здесь: Abstract Relational Comparison
- 1. Эквивалент Math.Min & Math.Max для дат?
- 2. math.max и math.min в пользовательской функции
- 3. Путаница с объединением math.Max и math.Min
- 4. Условный оператор внутри Math.min или Math.max в JavaScript
- 5. Сделайте Math.max и Math.min измените значение, к которому они применяются?
- 6. Как работает math.min
- 7. По сравнению с Math.Min или Math.Max короткое замыкание?
- 8. Math.min (Math.max (x, 0), 8) что это значит?
- 9. javascript context with Math.max
- 10. Как нас найти math.max и math.min, чтобы опустить высокие и низкие оценки
- 11. Как найти три крупнейших и три наименьшие decmicals с использованием Math.max, Math.min
- 12. Функция Math.max в Javascript
- 13. JavaScript Math.min возвращает неправильное значение
- 14. math.min и math.max vs sort для эффективного нахождения значений в списке
- 15. Как функция .reduce() работает с Math.max() в Javascript?
- 16. Как использовать функции Math.max и Max.min в массиве?
- 17. Понимание Math.max
- 18. Скорость и стиль Math.max против троичного оператора в JavaScript
- 19. Как предотвратить Math.max() return NaN?
- 20. Math.min в объекте c
- 21. C# Math.Max type handling
- 22. Разница между Math.min() и если условие
- 23. Math.min (найдено: двойной)
- 24. Object Math.max и IndexOf, чтобы получить индекс
- 25. Как использовать Math.max и т.д., как функции высшего порядка
- 26. Math.max() для переменных
- 27. Typcript & Knockout.js Math.max вычисляется
- 28. Дерево выражений - замена Math.Max
- 29. Извлечение элементов внутри Math.max
- 30. Math.max против Enumerable.Max
Инициализировать значение; итерация по коллекции, тестирование, если каждый элемент больше или меньше текущего наивысшего/самого низкого значения; если это так, замените значение на этот элемент. – grayshirt