Javascript Averages

Javascript Averages

本文关键字:Averages Javascript      更新时间:2023-09-26

我正在努力学习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++){
}

这将是正确的方法。

  1. 不要在使用变量时不使用var关键字声明它们,否则它们将成为全局属性。

  2. JavaScript数组是基于零索引的数组。因此,如果数组的大小是3,那么第一个元素将用0访问,最后一个元素将使用2访问。JavaScript非常宽容,所以当您访问数组中无效索引处的元素时,它只会返回undefined

  3. 在迭代中,您将用average值替换当前函数对象。因此,对average的后续调用将失败,因为average不再是函数对象。

  4. 一个好的做法是让函数返回计算的值,而不是打印值,这样就不会违反单一责任原则。

在您的情况下,

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])