在一個被廣為流傳的 JavaScript Meme(梗圖)中,我們可以看到這么一個例子,Math.max() 在不填入的引數的情況下回傳了 -INFINITY,Math.min() 在同樣的情況下回傳了 INFINITY,

明明是一個求最大數的方法,卻回傳了用于表示最小數的 -INFINITY,這讓我感覺到有點匪夷所思,
想探尋為什么其實很簡單,標準庫的代碼其實也是人寫的,只要去找一下 Math.max() 與 Math.min() 的具體實作方式就能知道了,
以下文字內容建議配合附加的代碼配合觀看
以 Math.max() 為例,在 Chrome 瀏覽器所使用的 JavaScript 引擎,也就是 V8 引擎的 Math 庫的原始碼中,我們可以看到當所填入的引數個數為 2 時,則使用 if 陳述句既可以實作回傳最大值的功能,但當填入的引數個數不為 2 時,則是使用 for 回圈遍歷所有的引數,并使用一個變數 r 存盤引數中最小的值,而變數 r 的在一開始被賦值為 -INFINITY,如果引數的個數為 0 時,則用于找出最小值的 for 陳述句塊則不會被執行,所以直接回傳了 -Infinity,
Math.min() 其實也是一個思路,這里就不多講了,
// ECMA 262 - 15.8.2.11
function MathMax(arg1, arg2) { // length == 2
var length = %_ArgumentsLength();
// 如果引數的個數為2,直接使用if陳述句判斷結果
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) {
// 如果兩個引數都為0(如引數填入了0與-0),優先回傳-0
// 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;
}
// 如果引數的個數不為2,比如填入了0個、1個甚至多個引數時
// 通過遍歷的方式找出最小值,并用變數r進行存盤
var r = -INFINITY;
// 如果引數個數為0,這下面的for陳述句塊則不會執行
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;
}
// 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/304210.html
標籤:JavaScript
