Javascript: How can I simplify an if-statement with multiple OR conditions?
抱歉,如果我在写这篇文章时犯了错误。我是新来的,不知道这是怎么回事,希望我能快点学。我也是javascript的新手。
所以问题是:我的code.elements.js文件中有这个文件,我不能让它工作。
这行吗?
1 | if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)){}; |
还是我必须用正常的方式来做?,像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | if (codePrompt == codeSwitch || codePrompt == codeSwitchBG || codePrompt == codeBlur || codePrompt == codeShowInfo){}; var codeSwitch = 'switch()'; var codeSwitchBG = 'switch(background)'; var codeBlur = 'blur()'; var codeShowInfo = 'showInfo()'; $(".code").on("click", function () { var codePrompt = prompt("Set the code in the command line."); if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)) { if (codePrompt == codeSwitch) { alert("Switching background..."); console.log("Used '" + codeSwitch +"' command."); } else if(codePrompt == codeBlur) { alert("Blurring elements..."); console.log("Used '" + codeBlur +"' command."); } else if(codePrompt == codeSwitchBG) { alert("Switching background..."); console.log("Used '"+ codeSwitchBG +"' command."); }else if(codePrompt == codeShowInfo) { alert("Showing info..."); console.log("Used '"+ codeShowInfo +"' command."); } } else { alert("Wrong command, try again."); console.log("Wrong command, try again."); }; }); |
"正常"的工作方式和你可能期望的一样。
但是,无论如何,if语句是多余的。你可以跳过它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if (codePrompt === codeSwitch) { alert("Switching background..."); console.log("Used '" + codeSwitch +"' command."); } else if (codePrompt === codeBlur) { alert("Blurring elements..."); console.log("Used '" + codeBlur +"' command."); } else if (codePrompt === codeSwitchBG) { alert("Switching background..."); console.log("Used '" + codeSwitchBG +"' command."); } else if (codePrompt === codeShowInfo) { alert("Showing info..."); console.log("Used '" + codeShowInfo +"' command."); } else { alert("Wrong command, try again."); console.log("Wrong command, try again."); } |
对于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var alertMessage ="", consoleMessage ="Used '" + codePrompt +"' command."; switch (codePrompt) { case codeSwitch: alertMessage ="Switching background..."; break; case codeBlur: alertMessage ="Blurring elements..."; break; case codeSwitchBG: alertMessage ="Switching background..."; break; case codeShowInfo: alertMessage ="Showing info..."; break; default: alertMessage = consoleMessage ="Wrong command, try again."; break; } alert(alertMessage); console.log(consoleMessage); |
你必须按照你提到的第二种方式来做:
1 2 | if (codePrompt == codeSwitch || codePrompt == codeSwitchBG || codePrompt == codeBlur || codePrompt == codeShowInfo){}; |
您还可以按如下方式重构以删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var commands = { 'switch()': 'Switching background', 'switch(background)': 'Switching background', 'blur()': 'Blurring elements', 'showInfo()': 'Showing info' }; $(".code").on("click", function () { var codePrompt = prompt("Set the code in the command line."); if (commands.hasOwnProperty(codePrompt)) { alert(commands[codePrompt] + '...'); console.log("Used '" + codePrompt +"' command."); } else { alert("Wrong command, try again."); console.log("Wrong command, try again."); } }); |
因为javascript有短路评估,而且您的字符串是真实的,所以您需要使用第二种方法或您所说的"正常方法"。
第一种方法不起作用,因为你最终会评估错误的事情。评估工作如下:
- 对
0 进行评估,判定为不可靠。 "zero" 被认为是真实的,并成为结果。
- 对
"zero" 进行评估,确定其真实性,并作为结果返回。 - 由于短路评估,未对
0 进行评估。
在原始代码中:
首先评估
- codeswitch codeswitchbg变为codeswitch
- codeswitch codeblur变为codeswitch
- codeswitch codeshowinfo变为codeswitch
所以你最终会评估:
这当然是错误的。
在实现这种逻辑的过程中,我建议使用switch语句来实现可读性,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | switch (codePrompt){ case"switch()": { //Handle case break; } case"switch(background)": { //Handle Case break; } case"blur()": { //Handle Case break; } default : { alert("Wrong command, try again."); console.log("Wrong command, try again."); } |
是的,你必须用"正常"的方式。
什么
1 | if (codePrompt == (codeSwitch || codeSwitchBG || codeBlur || codeShowInfo)){}; |
确实是
1)测试所有开关——如果有,返回真
2)测试codeprompt==true或false。
基于您的代码,您可以完全删除该测试,然后直接进入您的最后一个测试。
另一个选项是使用switch语句,最后一个else将成为默认子句。