Javascript Averages
Javascript Averages
我正在努力学习Javascript。我构建了以下代码来从一个数字数组中找到平均值。它工作除了最后返回的值总是NaN。我不明白为什么。如果我把这部分移到块外,它似乎完全忘记了变量和应该等于什么。我应该在JS中使用某种全局变量类型的等价物吗?
var average = function(myarray) {
sum = 0;
for (counter = 0; counter <= myarray.length; counter++) {
sum = sum + myarray[counter];
average = sum / myarray.length;
console.log(average);
};
}
average([1, 2, 3])
更改
counter <= myarray.length
至
counter < myarray.length
因为索引从0开始。
完整示例:
var average = function(myarray) {
var sum = 0;
for (var counter = 0; counter < myarray.length; counter++) {
sum += myarray[counter];
}
return sum / myarray.length;
}
console.log(average([1,2,3]));
JSBin演示:http://jsbin.com/siyugi/1/edit
myarray[myarray.length]
就是undefined
,它使您的计算充满了NaN
(不是数字)。
只需将其更改为
for(counter = 0; counter < myarray.length; counter ++) {
// ...
}
由于您只是在学习,您应该知道在这样的for循环中不使用.length是一种很好的做法。它导致代码必须在每个循环中检查数组的长度。记住.length是返回数组中元素的数量;但是数组索引从0开始。
for(var counter = 0, length = myarray.length; counter < length; counter++){
}
这将是正确的方法。
-
不要在使用变量时不使用
var
关键字声明它们,否则它们将成为全局属性。 -
JavaScript数组是基于零索引的数组。因此,如果数组的大小是3,那么第一个元素将用0访问,最后一个元素将使用2访问。JavaScript非常宽容,所以当您访问数组中无效索引处的元素时,它只会返回
undefined
。 -
在迭代中,您将用
average
值替换当前函数对象。因此,对average
的后续调用将失败,因为average
不再是函数对象。 -
一个好的做法是让函数返回计算的值,而不是打印值,这样就不会违反单一责任原则。
在您的情况下,
for (counter = 0; counter <= myarray.length; counter++) {
counter
一直运行到数组的最后一个索引+1。由于JavaScript在上一次迭代中返回undefined
,因此在算术运算中它返回NaN
。
console.log(1 + undefined);
# NaN
所以,你需要更改代码,比如这个
function Average(myarray) {
var sum = 0, counter;
for (counter = 0; counter < myarray.length; counter++) {
sum = sum + myarray[counter];
}
return sum / myarray.length;
}
如果你感兴趣,你可以用Array.prototype.forEach
计算总和,就像这个一样
function Average(myarray) {
var sum = 0;
myarray.forEach(function(currentNumber) {
sum += currentNumber;
});
return sum / myarray.length;
}
更好的是,你可以用Array.prototype.reduce
计算总和,就像这个
function Average(myarray) {
return myarray.reduce(function(sum, currentNumber) {
return sum + currentNumber;
}, 0) / myarray.length;
}
您可以计算一个数字数组的平均值,如下所示:
var avg = c => c.reduce((a,b) => a +b) / c.length;
avg([1,2,3])
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在Javascript中将JSon对象转换为数组
- Javascript生成的表单未提交
- 使用javascript将动态表从一个html页面打印到另一个html页
- Javascript Averages