JavaScript if/else条件判断随机数分支失效问题排查
问题原因
你代码里每调用一次matchingPercentage(),就会重新生成一个1到100之间的全新随机数,全程没有固定存储过某次生成的匹配值,判断分支、最终输出用的都是完全独立的随机结果。
你看到最终输出匹配值为93却走了else分支,本质是这个93是执行到else分支的document.write时才调用函数生成的,和之前if、else if判断阶段调用函数生成的所有值都没有关系。
举个实际触发该bug的典型执行流程:
- 第一个if判断阶段:第一次调用函数返回69,不满足
>=70的条件,整个if分支直接跳过 - else if判断阶段:第一次调用函数返回28,不满足
>=30的条件,整个else if分支直接跳过 - 进入else分支执行输出:调用函数返回93,最终页面显示匹配值93,和前面判断时用的69、28完全是三个独立的随机结果,自然会出现分支和显示值不匹配的问题。
修复方法
在条件判断前只调用一次matchingPercentage(),把生成的匹配值存到变量里,后续所有判断、输出逻辑都复用这个变量即可,修复后代码如下:
function loveMatching (name1, name2) { name1 = prompt ("Enter your name!"); name2 = prompt ("Enter your crush name!"); // 仅生成一次匹配分数,全程复用 const matchScore = matchingPercentage(); if (matchScore >= 70 && matchScore <= 100) { document.write(" The compability between: " + name1 + " and " + name2 + " is of a " + matchScore + "%. You guys are meant to be together!"); } else if( matchScore >=30 && matchScore <70) { document.write(" The compability between: " + name1 + " and " + name2 + " is of a " + matchScore + "%. Too close to fail!"); } else { document.write(" The compability between: " + name1 + " and " + name2 + " is of a " + matchScore + "%. You better look in another direction!"); } } function matchingPercentage() { var n = Math.random(); n = Math.floor(n * 100) + 1; return n; } loveMatching();
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

