HOWTO · JavaScript
在 JavaScript 中求平均值的示例
說明如何以數值總和除以數值個數計算平均值,並透過 HTML 陣列範例與函式引數範例示範 JavaScript 實作。
本頁內容
JavaScript 沒有內建函式可計算陣列的算術平均數。常用公式是將所有數值相加,再除以數值的個數。你可以用迴圈實作這項計算,再從 HTML 按鈕呼叫該函式,或直接將數值傳給函式。
平均值公式的運作方式
以 28、78、32 和 14 為例,將數值相加得到 152,再除以 4,算術平均數就是 38。通用公式為 sum / count。JavaScript 數字的運算結果可能包含小數,因此除非應用程式需要特定的顯示格式,否則不必四捨五入。例如,toFixed(2) 會將數字格式化成小數點後兩位的字串;若後續計算仍需要數值,請保留原本的數字結果。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
function average(values) {
let sum = 0;
for (const value of values) {
sum += value;
}
return sum / values.length;
}
console.log(average([28, 78, 32, 14]));
38
此範例使用 for...of 迴圈將陣列中的每個元素相加,再將總和除以陣列的 length。提供的 JavaScript 執行結果為 38。
在 HTML 頁面中計算陣列平均值
以下完整頁面會將按鈕連結到自訂的 calculateAverage 函式。按下按鈕後,頁面會計算四個數值的平均值,並以警示視窗顯示結果。迴圈會先將每個數值相加,再除以陣列長度。這些數值的平均值為 38。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Calculate an array average</title>
</head>
<body>
<h1>Average of 28, 78, 32, and 14</h1>
<button type="button" onclick="calculateAverage()">Click to get Average</button>
<script>
function calculateAverage() {
const values = [28, 78, 32, 14];
let sum = 0;
for (const value of values) {
sum += value;
}
alert(`Average of (${values}) is: ${sum / values.length}`);
}
</script>
</body>
</html>
HTML 按鈕的 onclick 處理常式會在讀者點擊時呼叫函式。這是頁面自行定義的函式,並非 JavaScript 提供的平均值方法。迴圈會逐一處理每個項目,而 values.length 會提供除數,因此更改陣列時不必另外修改數值個數。HTML 程式碼區塊呈現的是瀏覽器頁面原始碼,並不代表曾在瀏覽器中執行。
從函式引數計算平均值
如果呼叫函式時傳入的是個別數值,而不是陣列,可以使用 rest 參數將它們收集成陣列。這個函式可接收一個或多個數值引數,並使用相同的總和除以個數公式。若沒有傳入引數,就沒有平均值可計算,因此函式會回傳 null,而不會除以零:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
function average(...numbers) {
if (numbers.length === 0) {
return null;
}
let sum = 0;
for (const number of numbers) {
sum += number;
}
return sum / numbers.length;
}
console.log(average(28, 78, 32, 14));
38
...numbers rest 參數會收集傳入的引數。輸入不為空時,函式會回傳一個數字,呼叫端可以在後續計算中重複使用;若沒有提供任何數值,呼叫端則可以檢查是否回傳 null。這是自訂函式,不是陣列或 JavaScript 的 Math 物件的方法。提供的 JavaScript 執行結果為 38。
處理空白或無效的輸入
空陣列沒有算術平均數,因為沒有可供相除的數值個數。將其總和除以陣列長度會得到 NaN,因此計算前應先檢查輸入。像 "12" 這種看起來是數字的字串,在此用途下本身並不是數字;null 或 NaN 等值也不應在未檢查的情況下加入總和。Number.isFinite 只接受有限的 JavaScript 數字,不會隱式轉換字串。
若要重複使用程式碼,請先確認輸入是非空陣列,且每個項目都是有限數值,再進行加總。若輸入不是陣列、陣列為空,或任何值未通過 Number.isFinite,此函式會回傳 null;只有所有檢查都通過後才會加總:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
function averageValidated(values) {
if (!Array.isArray(values) || values.length === 0) {
return null;
}
if (!values.every(Number.isFinite)) {
return null;
}
let sum = 0;
for (const value of values) {
sum += value;
}
return sum / values.length;
}
由於 Number.isFinite 不會強制轉換值,因此字串和 null 會與 NaN 及正負無限大一樣遭到拒絕。呼叫端可以檢查是否回傳 null,並在顯示結果前提示使用者。將輸入驗證與公式分開,能讓算術邏輯更容易檢查。
顯示結果時,只在呈現階段進行格式化。若將底層數值四捨五入,後續計算可能受到影響;toFixed 格式化則適合用於顯示。這些檢查將輸入處理與計算本身分開,也有助於避免顯示令人誤解的 NaN 警示。