使用else if语句的奇怪行为(javascript)

时间:2014-12-08 09:11:13

标签: javascript if-statement return-value comparison-operators

据我所知,代码工作正常,但是当添加或编辑更多信息时,if else语句开始表现得很奇怪。它正确读取了百分比值,但没有返回正确的字母字符串。

var total = function (){
    var earned = 0;

     for(i = 0; i < Assignments.length; i++){
         earned += parseInt(Assignments[i].earned);
     }
     var possible = 0;

     for(i = 0; i < Assignments.length; i++){
         possible += parseInt(Assignments[i].possible);
     }
     var percent = (Math.floor((earned/possible) * 100));

     console.log(percent);

  //grade letter

      if (percent >= 90){
         grade.innerHTML = '';
         grade.innerHTML = 'A ' + percent + '%';
      } else if (percent <= 89 && 80 >= percent){
         grade.innerHTML = '';
         grade.innerHTML = 'B ' + percent + '%';
      } else if (percent <= 79 && 70 >= percent){
         grade.innerHTML = '';
         grade.innerHTML = 'C ' + percent + '%';
      } else if (percent <= 69 && 60 >= percent){
         grade.innerHTML = '';
         grade.innerHTML = 'D ' + percent + '%';
      } else if(percent <= 59 && 0 >= percent){
         grade.innerHTML = '';
         grade.innerHTML = 'F ' + percent + '%';
      } else {grade.innerHTML = '';}



};

在几次输入后,它将返回如下内容:

B is = 73%? Noo!

我认为如果陈述冲突可能是其他的,但老实说,我不知道为什么这样做会这样。

3 个答案:

答案 0 :(得分:6)

您在else if s后面进行了比较,您使用70 >= percent而不是percent >= 70(依此类推)。

另外,如果您要为其分配其他内容,则没有理由将''分配给innerHTML,并且没有理由重申上限(percent <= 89等),因为您正在使用else if,因此percent >= 90分支已经被跟踪。重申它们也是一个维护问题(你将改变一个但忘记改变另一个)。

所以:

if (percent >= 90) {
    grade.innerHTML = 'A ' + percent + '%';
} else if (percent >= 80) {
    grade.innerHTML = 'B ' + percent + '%';
} else if (percent >= 70) {
    grade.innerHTML = 'C ' + percent + '%';
} else if (percent >= 60) {
    grade.innerHTML = 'D ' + percent + '%';
} else if (percent >= 0) {
    grade.innerHTML = 'F ' + percent + '%';
} else {
    grade.innerHTML = '';
}

当然,您可以使用地图,因为您的等级边界可以被10整除:

// Somewhere central
var grades = {
    6: 'D',
    7: 'C',
    8: 'B',
    9: 'A',
    10: 'A'
};

// ...then simply:
if (percent >= 0) {
    grade.innerHTML = (grades[Math.floor(percent / 10)] || 'F') + ' ' + percent + '%';
} else {
    grade.innerHTML = "Less than 0?!";
}

&#13;
&#13;
var grades = {
    6: 'D',
    7: 'C',
    8: 'B',
    9: 'A',
    10: 'A'
};

function showGrade(percent) {
  var grade;
  if (percent >= 0) {
    grade = (grades[Math.floor(percent / 10)] || 'F') + ' ' + percent + '%';
  } else {
    grade = "Less than 0?!";
  }
  snippet.log(grade);
}

var n;
for (n = 0; n <= 100; ++n) {
  showGrade(n);
}
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

If-Else条件范围看错了,试试这段代码......

var total = function (){
var earned = 0, possible = 0;
for(i = 0; i < Assignments.length; i++){
     possible += parseInt(Assignments[i].possible);
     earned += parseInt(Assignments[i].earned);
 }
 var percent = (Math.floor((earned/possible) * 100));

 console.log(percent);

  //grade letter

  if (percent >= 90){
     grade.innerHTML = 'A ' + percent + '%';
  } else if (percent >= 80 && percent <= 89){
     grade.innerHTML = 'B ' + percent + '%';
  } else if (percent >= 70 && percent <= 79){
     grade.innerHTML = 'C ' + percent + '%';
  } else if (percent >= 60 && percent <= 69){
     grade.innerHTML = 'D ' + percent + '%';
  } else if(percent >= 0 && percent <= 59){
     grade.innerHTML = 'F ' + percent + '%';
  } else {grade.innerHTML = '';}
};

虽然我优化了一些代码,但不需要2个循环,你可以在单循环中求earnedpossible变量,在元素中赋值时不需要.innerHTML = ''

答案 2 :(得分:0)

我使用不同的比较方法找到了关于效率的好文章。我仍然建议使用switch-block而不是if / else,但它在技术上并不比你的解决方案好,但我认为它更好阅读。这是一段代码:

switch (true) {
case (0 <= val &&  val < 1000): /* do something */ break;
case (1000 <= val &&  val < 2000): /* do something */ break;
...
case (29000 <= val &&  val < 30000): /* do something */ break;
}

取自这篇文章。还有一个有趣的表(在第一个答案中) Switch statement for greater-than/less-than 以及使这项工作的不同方法。我知道这实际上不是你的答案的解决方案,但是如果你需要添加更多的if / else并且正在使用值做一些巨大的列表,它可能会派上用场。