JavaScript:获取未定义的值

时间:2017-10-27 03:43:29

标签: javascript arrays object undefined

我编写了一个函数,它接受一个对象数组(students3)并打印出学生的名字和他们的平均测试分数。

var students3 = [
  {
    name : "Anthony",
    id : 0,
    grades : [{ id : 0, score : 84},{ id : 1, score : 20},{ id : 2, score : 80}]
  }, 
  {
    name : "Winnie",
    id : 1,
    grades : [{ id : 0, score : 62},{ id : 1, score : 56},{ id : 2, score : 100}]
  },
  {
    name : "Pawandeep",
    id : 2,
    grades : [{ id : 0, score : 79},{ id : 1, score : 92},{ id : 2, score : 49}]
  }
];

我的解决方案:

function getAverageScore(student)
{
  var sum = 0;
  var grades = student.grades;
  for(var i = 0; i < grades.length; i++)
  {
    var grade = grades[i];
    sum += grade.score;
  }
  var avg = sum/grades.length;
  return avg;
}


function printAverageGrade(students)
{
  for(var i = 0; i < students.length; i++)
  {
    var student = students[i];
    var averageScore = getAverageScore(student);

    console.log(student.name, averageScore);
  }
}

运行console.log(printAverageGrade(students3));后的预期结果是:

  

Anthony 61.333333333333336

     

Winnie 72.66666666666666

     

Pawandeep 73.33333333333333

我的结果:

  

Anthony 61.333333333333336

     

Winnie 72.66666666666666

     

Pawandeep 73.33333333333333

     

未定义

任何人都可以告诉我为什么我的结果中出现了未定义的值?谢谢。

3 个答案:

答案 0 :(得分:1)

printAverageGrade函数本身会将消息记录到控制台。它没有return语句,因此返回undefined

如果您将printAverageGrade(students3)记录到控制台,则会记录undefined

解决方案:不要记录printAverageGrade(students3)

console.log(printAverageGrade(students3))printAverageGrade(students3)

答案 1 :(得分:1)

最后一行是函数的返回值。如果您查看getAverageScore(student)函数,就可以看到return avg;,这就是给出该值的原因。

printAverageGrades不会返回任何内容,因此其返回值为undefined。控制台日志记录虽然有效,但只要您不尝试使用它来设置任何变量,此代码就可以了。

答案 2 :(得分:0)

如果您使用浏览器的JavaScript控制台运行,是否确定您没有看到printAverageGrade的返回值?看到这个简单的例子:

> function foo() { console.log("hello"); }
<- undefined
> foo()
  hello
<- undefined

两个undefined来自控制台,试图打印立即命令的返回值,如果我们尝试这样做:

> function foo() { console.log("hello"); return "defined"; }
<- undefined
> foo()
  hello
<- "defined"

具体来说,您的示例代码使用:

console.log(printAverageGrade(students3));

由于printAverageGrade()不返回任何内容,控制台会记录undefined