JavaScript技术问询:为何石头剪刀布游戏的switch case语句异常?
问题原因解析
你的switch语句写法存在两个致命问题,导致逻辑完全不符合预期:
1. 逗号运算符的误用
switch (p1,p2)里的逗号运算符是JavaScript的序列运算符,它会依次执行逗号两边的表达式,最终返回最后一个表达式的值。也就是说,你的switch实际上是在对p2的值做判断,完全忽略了p1,这直接导致所有需要结合p1、p2一起判断的逻辑全部失效。
2. 逻辑与&&的误解
case里的"scissors" && "paper"这种写法,逻辑与运算符在处理非空字符串时,会返回最后一个“真值”。因为所有非空字符串都是布尔真值,所以"scissors" && "paper"的结果就是"paper","scissors" && "rock"的结果是"rock"——这意味着你的case实际上只在判断p2的值,和p1完全无关,自然会出现大量错误匹配。
修正后的switch实现
要让switch能同时判断p1和p2的组合,你需要把两个参数合并成一个唯一的标识,比如拼接成字符串:
let rps = (p1, p2) => { switch (`${p1},${p2}`) { case "scissors,paper": return "Player 1 won!"; case "scissors,rock": return "Player 2 won!"; case "scissors,scissors": return "Draw!"; case "paper,paper": return "Draw!"; case "paper,scissors": return "Player 2 won!"; case "paper,rock": return "Player 1 won!"; case "rock,rock": return "Draw!"; case "rock,paper": return "Player 2 won!"; case "rock,scissors": return "Player 1 won!"; } };
这样每个case对应p1和p2的唯一组合,switch就能正确匹配判断了。另外注意,return语句已经会跳出函数,所以break在这里是多余的,可以直接去掉。
内容的提问来源于stack exchange,提问作者Blanka
相关产品推荐
相关产品推荐

