HOWTO · JavaScript
在 JavaScript 中求平均值的示例
JavaScript 没有内置的数组平均值函数。本文介绍“总和除以数量”的计算公式,并通过 HTML 按钮示例和可变参数函数演示如何求平均值。
本页内容
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 代码块展示的是浏览器页面源码,并不表示已经在浏览器中运行过。
根据函数参数计算平均值
如果调用方传入的是多个独立数值,而不是一个数组,可以用剩余参数将它们收集到数组中。此函数接受一个或多个数值参数,并使用相同的“总和除以数量”公式。没有传入参数时,无值可用于计算平均值,因此函数会返回 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 剩余参数会收集传入的参数。对于非空输入,函数会返回一个数值,调用方可以在后续计算中继续使用;如果没有传入数值,调用方可以检查是否返回了 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 提示框。