JS中两个数组元素比较失效问题求助
问题排查:JS比较逻辑失效的原因及修复方案
嘿,我一眼就揪出问题所在啦——类型不匹配导致你的严格相等判断完全失效了!
问题根源
你代码里的prompt()方法返回的是字符串类型的用户输入,而questions数组里存储的答案是数字类型(比如1、2、3)。JS里的===是严格相等运算符,它会同时检查值和类型是否完全一致,字符串和数字哪怕值看起来一样,类型不同也会判定为不相等,这就是为什么你的比较逻辑永远走else分支的原因。
两种修复方案
方案1:把用户输入转为数字类型
修改answers.push那一行,用Number()或者parseInt()把字符串输入转成数字:
var questions = [ ['how many states?', 1], ['how many continents?', 2], ['how many legs?', 3] ] var answers = []; var rightAnswers = []; var wrongAnswers = []; for(i = 0; i<questions.length; i+=1){ // 将用户输入转为数字,toLowerCase()对数字无影响,可留可删 var userInput = prompt(questions[i][0]).toLowerCase(); answers.push(Number(userInput)); if(questions[i][1] === answers[i]){ rightAnswers.push(questions[i][0]); // 建议取消注释,这样就能收集正确的问题啦 console.log("success!"); }else{ console.log("bummer"); } }
方案2:把问题数组里的答案改为字符串类型
如果你不想转换输入类型,也可以直接修改questions数组,把答案改成字符串:
// 把数字答案改成字符串形式 var questions = [ ['how many states?', '1'], ['how many continents?', '2'], ['how many legs?', '3'] ] var answers = []; var rightAnswers = []; var wrongAnswers = []; for(i = 0; i<questions.length; i+=1){ answers.push(prompt(questions[i][0]).toLowerCase()); if(questions[i][1] === answers[i]){ rightAnswers.push(questions[i][0]); console.log("success!"); }else{ console.log("bummer"); } }
额外优化建议
如果用户输入了非数字内容(比如字母、符号),转成数字会得到NaN,这时候可以加个输入有效性判断,还能让用户重新输入当前问题:
var questions = [ ['how many states?', 1], ['how many continents?', 2], ['how many legs?', 3] ] var answers = []; var rightAnswers = []; var wrongAnswers = []; for(i = 0; i<questions.length; i+=1){ var userInput = prompt(questions[i][0]).toLowerCase(); var numInput = Number(userInput); // 先判断输入是否为有效数字 if (!isNaN(numInput)) { answers.push(numInput); if(questions[i][1] === numInput){ rightAnswers.push(questions[i][0]); console.log("success!"); }else{ console.log("bummer"); } } else { console.log("请输入有效的数字哦!"); // 让循环停在当前问题,重新提问 i--; } }
内容的提问来源于stack exchange,提问作者Mag
相关产品推荐
相关产品推荐

