Javascript - 在此示例中使用If Else的最佳实践

时间:2014-01-23 21:26:57

标签: javascript if-statement coding-style

我目前正在学习Javascript并通过摇滚,剪刀,纸质教程。根据Codeacademy的相同教程,本网站上已经有一些查询。但是,我的查询是基于我的观点,所以我希望得到SO社区的一些反馈。

我的代码如下: -

var userChoice = prompt("Are you picking rock, paper or scissors?");
var computerChoice = Math.random();
if (computerChoice < 0.34) {
    computerChoice = "rock";
} else if(computerChoice <= 0.67) {
    computerChoice = "paper";
} else {
    computerChoice = "scissors";
}

console.log ("Computer picks" + " " +computerChoice);
var compare = function (choice1, choice2) {
    if (choice1 === choice2) {
        console.log ("You're both psychic. It's a tie!");
    }    


    if (choice1=="rock") {
        if (choice2 =="scissors") {
            console.log ("Rock wins. You bad boy, you.");
        }
        if (choice2=="paper") {
         console.log ("Paper wins. You noob") ;
        }
    }

    if (choice1=="paper") {
        if (choice2=="rock") {
            console.log ("Paper wins. You bad boy, you.");
        }
        if (choice2=="scissors") {
            console.log ("Scissors wins. You noob.") ;
        }
    }

    if (choice1=="scissors") {
        if (choice2=="rock") {
            console.log ("Rock wins, you noob");
            }
        if (choice2=="paper") {
            console.log ("Scissors wins. You bad boy, you.");
        }
    }

    };

    compare (userChoice,computerChoice);

我一直认为在使用条件时,它应该只是以下两种情况之一:

  1. 单一条件,然后只需if就好了。
  2. 多个条件,然后必须 if并以else ifelse if等结束以else结尾。
  3. 因此,我最初在第二个嵌套的条件语句else中使用了if (choice2=="paper")。然后意识到逻辑是错误的,因为它打印了那个字符串,如果它是一个平局。

    所以我想到了它,并意识到如果我使用if而不是其他,它会起作用。它确实有效。但是,我只是不确定我的代码是错误的......还是不太理想。是吗?

    此外,为了让它看起来更好(并且不仅仅是if),我正在考虑使用if替换if (choice1=="paper")中的else if。但是,我不知道如何结束下一个条件 - if (choice1=="scissors") {。你会怎么做?

    原谅长期的疑问 - 我只是想确保我理解得很好。

    由于

3 个答案:

答案 0 :(得分:2)

这是完全代码风格,所以你应该争取'干净的代码'。

最天真的选择是使用开关。例如:

var compare = function (choice1, choice2) {

    switch(true){
        case choice1 === choice2:
            console.log ("You're both psychic. It's a tie!");
            break;
        case choice1 ===  "rock":
            if(choice2 === "scissors"){
                console.log ("Rock wins. You bad boy, you.");
            } else{
                console.log ("Paper wins. You noob") ;
            }
            break;
        case choice1 === "paper":
                if (choice2=="rock") {
                    console.log ("Paper wins. You bad boy, you.");
                } else{
                    console.log ("Scissors wins. You noob.") ;
                }
            break;
        case choice1 === "scissors":
            if (choice2=="rock") {
                console.log ("Rock wins, you noob");
            } else{
                console.log ("Scissors wins. You bad boy, you.");
            }
            break;
    }
};

这只是一种方法。无论你选择什么,你都应该尝试使代码更清晰,更优雅。

此版本可能看起来更好:

var compare = function(choice1, choice2){
    var options = ['rock','paper','scissors'];
    var result = options.indexOf(choice1) - options.indexOf(choice2);
    switch(result){
        case 1:
        case -2:
            //choice1 wins
            break;
        case 0: 
            //tie
            break;
        case -1:
        case 2:
            //choice2 wins
            break;
    }
}

但是这个版本并没有立即被理解 - 因此有一个比这个和第一个更好的解决方案 - 一个更清晰且更容易让读者理解的解决方案 - 你应该试着找到一个。< / p>

答案 1 :(得分:0)

if(choice1 == choice2){
    console.log ("You're both psychic. It's a tie!");
}
if(choice1 == "rock"){
    if(choice2 == "scissors"){
        console.log ("Rock wins. You bad boy, you.");
    }
    else {
        console.log ("Paper wins. You noob") ;
    }
}
...

假设choice1choice2都是"rock",该函数会检查if(choice1 == choice2)。这是事实,所以它会打印'tie'消息。

因为下一个条件也是if,所以它会检查choice1是否为"rock"。它是,因此它进入嵌套块,检查choice2是否是“剪刀” - 它不是,因此它移动到else块,并打印'纸张获胜'消息。

当它是平局时,choice1 == choice2你真的不需要进一步检查。只有在不满足之前的条件时才会检查else ifelse条件。

所以你可以把它改成:

if(choice1 == choice2){
    console.log ("You're both psychic. It's a tie!");
}
else if(choice1 == "rock"){
    if(choice2 == "scissors"){
        console.log ("Rock wins. You bad boy, you.");
    }
    else {
        console.log ("Paper wins. You noob") ;
    }
}
else if(choice1 == "paper"){
    ...
}
else{ //choice1 == "scissors"
    ...
}

您还可以使用return语句尽早中断函数。或者,正如Etai建议的那样,您可以使用switch来检查条件。

答案 2 :(得分:0)

绝对使用else if,以便第二个条件测试仅在第一个为假的情况下运行

if ('hi' === 'hi) {
    console.log('true');
} else{
    console.log('this will never log')
}

也可以用三元运算符编写:

'hi' === 'hi' ? console.log('true') : console.log('this will never log');

替代三元选项 -

console.log('hi' === 'hi' ? 'true' : 'this will never log');