2015-11-22 1 views
5

Мне действительно интересно, как эти функции действительно работают? Я знаю, что есть много вопросов о том, как их использовать, я уже знаю, как их использовать, но я не мог найти нигде, как фактически реализовать эту функцию в массиве, например, если таких функций не было ? Как бы вы закодировали такую ​​функцию, если не было помощников?Как работает Javascript Math.max и Math.min?

+0

Инициализировать значение; итерация по коллекции, тестирование, если каждый элемент больше или меньше текущего наивысшего/самого низкого значения; если это так, замените значение на этот элемент. – grayshirt

ответ

1

Основные функциональные возможности:

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)

+1

Не забывайте, что он также работает с объектами, которые имеют те же свойства, что и массив: 'Math.max.apply (null, {0: 1,1: 4,2: 2, length: 3})' – ahitt6345

+1

@ ahitt6345 Это хороший момент; и это может быть полезно. конечно, вам нужно будет выполнить Math.functionname.apply (null, obj); Я просто хотел указать это на случай, если кто-то задается вопросом, почему именно копирование не сработало. – csga5000

+0

кричит, забыл о функции, которую я хотел применить ... спасибо, что рассказал мне. : | lol – ahitt6345

2

Вот код 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 является хранилищем.

+0

Собственно, [он находится в JavaScript] (https://github.com/v8/v8/blob/cd81dd6d740ff82a1abbc68615e8769bd467f91e/src/js/math.js#L77-L102). –

+0

Спасибо. Я отредактирую ответ. –

0

Это легко реализовать с помощью 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; 
} 
+0

Вам не нужно сначала нарезать; вы можете просто сделать 'Array.prototype.reduce.call'. –

2

Ниже, как реализовать функции, если 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

1

Ну вот 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. (!, Который может/должен помочь вам в реализации)

3

Давайте посмотрим на спецификации

В 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. 

Более поздние версии спецификации дают нам:

ECMAScript 5.1

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

ECMAScript 2015

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

Смежные вопросы