Javascript Switch语句实现未提供预期行为

Javascript Switch语句实现未提供预期行为,javascript,if-statement,switch-statement,Javascript,If Statement,Switch Statement,我正在用vanilla JavaScript开发一个测验应用程序,为了获得最佳实践,我希望确保遵循D.R.Y.原则 我有五个问题需要核对答案 因此,我没有五次使用if语句,而是想实现一个switch语句,如下所示: callback.js: function submitAnswers() { var total = 5; var score = 0; // Get User Input var q1 = document.forms['quizForm']['q1'].valu

我正在用vanilla JavaScript开发一个测验应用程序,为了获得最佳实践,我希望确保遵循D.R.Y.原则

我有五个问题需要核对答案

因此,我没有五次使用
if
语句,而是想实现一个
switch
语句,如下所示:

callback.js:

function submitAnswers() {
  var total = 5;
  var score = 0;
  // Get User Input
  var q1 = document.forms['quizForm']['q1'].value;
  var q2 = document.forms['quizForm']['q2'].value;
  var q3 = document.forms['quizForm']['q3'].value;
  var q4 = document.forms['quizForm']['q4'].value;
  var q5 = document.forms['quizForm']['q5'].value;

  // Validation
  for (i = 1; i <= total; i++) {
    if (eval('q'+i) == null || eval('q'+i) == '') {
      alert('You missed question '+ i);
      return false;
    }
  }

  // Set Correct Answers
  var answers = ["d","b","c","a","b"];

  // Check answers
  switch (answers) {
    case q1 == answers[0]:
      score++;
      break;
    case q2 == answers[1]:
      score++;
      break;
    case q3 == answers[2]:
      score++;
      break;
    case q4 == answers[3]:
      score++;
      break;
    case q5 == answers[4]:
      score++;
      break;
  }

  alert('You scored '+score+' out of ' +total);
}
函数submitAnswers(){
var总计=5;
var得分=0;
//获取用户输入
var q1=document.forms['quizForm']['q1'].value;
var q2=document.forms['quizForm']['q2'].value;
var q3=document.forms['quizForm']['q3'].value;
var q4=document.forms['quizForm']['q4'].value;
var q5=document.forms['quizForm']['q5'].value;
//验证

对于(i=1;i而言,
switch
值必须与一个大小写表达式匹配。
answers
将永远不会与
q1==answers[0]
或类似的表达式匹配。如果将其更改为
switch(true)
开关将工作,但您仍将只检查一个答案,而不是全部五个答案(而且
开关的使用也不是很好)

如果使用五个不同的
qX
变量,则需要五个不同的
If
语句。但这不是您应该做的。请参阅
***
注释:

function submitAnswers() {
  var total = 5;
  var score = 0;
  var i; // *** Note we declare `i` so it's not an implicit global
  // Get User Input
  // *** ...as an array
  var responses = [];
  for (i = 1; i <= 5; ++i) {
    responses.push(document.forms['quizForm']['q' + i].value);
  };

  // Set Correct Answers
  // *** Moved
  var answers = ["d","b","c","a","b"];

  // Validation and check answers both at once
  for (i = 0; i < responses.length; ++i) {
    // *** `value` is never `null`, we can just use ! here
    if (!responses[i]) {
      alert('You missed question '+ i);
      return false;
    }
    // *** Check response
    if (response[i] == answers[i]) {
      ++score;
    }
  }

  alert('You scored '+score+' out of ' +total);
}
函数submitAnswers(){
var总计=5;
var得分=0;
var i;//***注意我们声明'i',因此它不是一个隐式全局变量
//获取用户输入
//***…作为一个数组
var响应=[];

对于(i=1;i简单方法。使用所有选择的答案形成一个数组,并使用
array\every

var correctanswers = ["d","b","c","a","b"];
var choosenanswers = [q1,q2,q3,q4,q5];
var isallcorrect = choosenanswers.every(function(item,index){
    return item == correctanswers[index];
});
console.log(isallcorrect);

您可以为此而不是switch语句创建一个可重用的函数,并使用for循环检查每个目标值

//答案
var answers=[“a”、“b”、“c”]
//正确增量
var=0;
//检查应答功能
var checkAnswer=函数(问题,答案){
如果(问题!==答案){
返回false;
}
返回true;
}
var form=document.getElementById('form');
表.addEventListener('submit',函数(e){
e、 预防默认值();
//请注意长度-1,因为这里有button元素
/**
*如果要为每个输入声明变量,请更改
*e.target.length和e.target[i]。q/a数组的值
*/
对于(var i=0;i

提交答案

请阅读一本关于Javascript和如何使用
开关的书
语句开关比较条件
开关(条件)
againts each
case
您确实是,switch语句条件是它在每个case中比较的条件。由于您比较了几个单独的值,因此在此处使用switch没有意义。有更好的方法可以做到这一点,就像在.t.J中使用循环并进行
if
比较一样,谢谢您的帮助.我会研究你在这里写的笔记和你的博客文章。
var correctanswers = ["d","b","c","a","b"];
var choosenanswers = [q1,q2,q3,q4,q5];
var isallcorrect = choosenanswers.every(function(item,index){
    return item == correctanswers[index];
});
console.log(isallcorrect);