RegisterAction函数if语句异常触发问题:输入'n'回应prompt时为何仍会首次执行?
问题原因分析与解决方案
嘿,我一眼就看到问题出在哪儿了——你的if条件判断写法犯了一个很常见的JavaScript逻辑错误!
核心问题:错误的逻辑或表达式写法
你写的条件是:
if(askbuyMore === "Y"||"y"||"Yes"||"yes")
这完全不是你想表达的“判断输入是否等于这几个值中的任意一个”。在JavaScript里,||(逻辑或)的规则是只要其中一个操作数是“真值”,整个表达式就会返回真值。而像"y"、"Yes"、"yes"这类非空字符串本身就是真值,所以不管askbuyMore的值是什么(哪怕是"n"),这个条件都会被判定为true,导致if分支永远执行。
举个简单的例子:false || "y"的结果是"y"(真值),所以整个条件会成立,这就是为什么你输入"n"时,代码还是走进了if块。
正确的写法
你需要给每个比较都加上完整的判断表达式,让每个||两边都是独立的比较:
if(askbuyMore === "Y" || askbuyMore === "y" || askbuyMore === "Yes" || askbuyMore === "yes")
或者更简洁的方式,把输入转为小写后再判断,减少重复代码:
const lowerInput = askbuyMore.toLowerCase(); if(lowerInput === "y" || lowerInput === "yes")
额外的小建议
顺便提两个代码里的小细节:
let registerTax = console.log(...)这行没用,因为console.log()的返回值是undefined,后面的registerTax;也不会有任何效果,直接去掉变量赋值,直接调用console.log()即可。- 当前代码只能处理最多两次“是否购买更多”的询问,如果用户一直选Y,第三次就不会再问了。可以用
do-while循环来实现多次询问的逻辑,比如:
let saveSub = buyMore(0); let askbuyMore; do { askbuyMore = prompt("Do you want to buy more? Y/N "); const lowerInput = askbuyMore?.toLowerCase(); if(lowerInput === "y" || lowerInput === "yes"){ saveSub = buyMore(saveSub); } } while(askbuyMore?.toLowerCase() === "y" || askbuyMore?.toLowerCase() === "yes");
内容的提问来源于stack exchange,提问作者David Paredes
相关产品推荐
相关产品推荐

