我正在研究JavaScript中的min和max方法,我找不到任何解释这些方法算法的帖子。我的猜测是,在像1234这样的数值变量中,您可以通过将数字分成4个值来获得最小值和最大值并进行比较。或者在数组中添加这些值,对该数组进行排序,并将min作为数组[0]。有没有解释过与这些方法有关的帖子?
答案 0 :(得分:1)
Math.min
和Math.max
分别从传递的参数集中返回最小值和最大值。
这样您就可以拆分数字的字符串表示来检索数字数组,然后将Math.min
或Math.max
方法应用于结果数组。
(function() {
var minDigit,
maxDigit,
numToDigitsArray;
numToDigitsArray = function(num) {
return ('' + Math.abs(num)).split('').map(function(digit) {
return parseInt(digit);
});
};
minDigit = function(num) {
return Math.min.apply(null, numToDigitsArray(num));
};
maxDigit = function(num) {
return Math.max.apply(null, numToDigitsArray(num));
};
console.log(minDigit(-5343240123));
console.log(maxDigit(753943240123));
})();
答案 1 :(得分:1)
在v8 JavaScript Engine的当前来源中,/build/v8/src/math.js
定义了Math.min()
和Math.max()
:
<强> Math.min:强>
// ECMA 262 - 15.8.2.12
function MathMin(arg1, arg2) { // length == 2
var length = %_ArgumentsLength();
if (length == 2) {
arg1 = TO_NUMBER_INLINE(arg1);
arg2 = TO_NUMBER_INLINE(arg2);
if (arg2 > arg1) return arg1;
if (arg1 > arg2) return arg2;
if (arg1 == arg2) {
// Make sure -0 is considered less than +0.
return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg1 : arg2;
}
// 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);
if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
// Make sure -0 is considered less than +0.
if (NUMBER_IS_NAN(n) || n < r || (r === 0 && n === 0 && %_IsMinusZero(n))) {
r = n;
}
}
return r;
}
<强> Math.max:强>
// ECMA 262 - 15.8.2.11
function MathMax(arg1, arg2) { // length == 2
var length = %_ArgumentsLength();
if (length == 2) {
arg1 = TO_NUMBER_INLINE(arg1);
arg2 = TO_NUMBER_INLINE(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);
if (!IS_NUMBER(n)) n = NonNumberToNumber(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;
}
如果您将Function.prototype.apply()与Math.min()
或Math.max()
一起使用,则可以获得一系列数字的最小值或最大值。
(借用adeneo上面的评论,因为我很懒:)
Math.max.apply(Math, '1234'.split(''));
// returns 4