请查看我的if条件。 我只是刷新我的javascript,我想知道,我如何检查,如果插入的变量,是我想要使用的那些。
显然,“游戏”应该只采取摇滚,纸张或剪刀。
现在if条件说,if(选择1和选择2等于摇滚或剪刀或纸){ 做这个; } else {做其他事情}
但显然它不按我想要的方式工作。
var choice1 = prompt("Player 1: Rock, scissors or paper?");
var choice2 = prompt("Player 2: Rock, scissors or paper?");
compare(choice1, choice2);
function compare(choice1, choice2) {
if(choice1 && choice2 === "rock" || "paper" || scissors) {
alert("You pass");
} else {
alert("Something went wrong");
}
有人能给我一个简短的解释,为什么if条件会传递它得到的每一个值?它永远不会显示消息“出了问题”。
答案 0 :(得分:2)
我相信它应该是这样的:
if ((choice1=="rock" || choice1=="paper" || choice1=="scissors") &&
(choice2=="rock" || choice2=="paper" || choice2=="scissors")){...
答案 1 :(得分:1)
问题是您的条件将始终评估为true,因为|| "paper"
条件将返回true-y值。仅这一点就可以使整个条件成立,因为值是OR,因此它总是通过。您正在检查choice1 && choice2 === "rock"
,这是真的没有写得正确。至于|| scissors
,因为scissors
未在此处定义,因此将为假。
考虑采用这种方法:
var validOptions = ["rock", "paper", "scissors"];
if(validOptions.indexOf(choice1) > -1 && validOptions.indexOf(choice2) > -1) {
// now compare choice1 and choice2 to determine the winner
} else {
alert("Something went wrong");
}
请注意,显示的解决方案不会修改用户输入或区分大小写的帐户。为了解决这个问题,你可以使用带有ignore-case标志的正则表达式:
var re = /\b(?:rock|paper|scissors)\b/i;
if (re.test(choice1) && re.test(choice2)) {
// ...
}
答案 2 :(得分:1)
对于数组有很多 indexOf 答案,但您也可以使用对象进行有效的resopnses:
var validResponses = {rock:'', paper:'', scissors:''};
if (choice1 in validResponses && choice2 in validResponses) {
// all good
}
如果你想要安全:
if (validResponses.hasOwnProperty(choice1) && validResponses.hasOwnProperty(choice2)) {
...
}
答案 3 :(得分:0)
if(choice1 && choice2 === "rock" || "paper" || scissors) {
有人能给我一个简短的解释,为什么if条件会传递它得到的每一个值?
因为它将被评估为
if ((choice && (choice2 === "rock")) || "paper" || scissors )
这可能不是你想要的。非空字符串"paper"
是一个真值,这意味着它将始终满足条件(并且由于短路评估,将不会查看参考错误scissors
)。
请参阅Check variable equality against a list of values(及其许多链接重复项)以了解如何正确执行此操作。
答案 4 :(得分:0)
function compare(choice1, choice2){
var identical = choice1 === choice2;
var options = ["rock", "paper", "scissors"];
if (identical && (options.indexOf(choice1) > -1))
alert("Pass");
else
alert("Not alike");
}
在此代码中,identical
将为true或false,如果为true,则可以检查它是否与options数组中的任何值匹配。
答案 5 :(得分:0)
您的代码正在按以下方式进行评估:
if (
choice1 // Non-empty strings always evaluate to TRUE
&&
choice2 === "rock"
// The above are evaluated together
// If both are not TRUE, FALSE is the result
||
"paper" // Non-empty string. TRUE
||
"scissors" // Non-empty string. TRUE
)
这个伪代码可能会有所帮助:
if (value of AND block
||
true
||
true)
由于OR每次都有true
,所以if块每次都会运行。
答案 6 :(得分:0)
当你说:
if(someString) { /* do something */ }
这在英语中意味着“如果someString的值不是空字符串,那就做点什么吧。”在Javascript中,这通常被称为“真实性”,因此任何字符串的真实性都是正确的,除了空字符串。
当你说:
if(someCondition || someString) { /* do something */ }
用英文写的,这意味着“如果someCondition评估为true,或者someString是真的,那么就做点什么。”由于“纸张”总是真实的,anything || "paper"
总是如此。
出于您的目的,我会重写这样的代码:
var validValues = ["rock", "paper", "scissors"];
if(validValues.indexOf(choice1) >= 0 && validValues.indexOf(choice2) >= 0) {
/* do something */
}
基本上,列出有效值,然后检查两个选项是否都出现在该列表中。摇滚,纸张,剪刀的游戏永远不会获得更多有效值,但在其他类似的情况下,这个列表可能会随着时间的推移而增长或缩小。