【问题标题】:Javascript - Best practice on using If Else in this exampleJavascript - 在此示例中使用 If Else 的最佳实践
【发布时间】:2014-01-23 21:26:56
【问题描述】:

我目前正在学习 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 并以 elseifelse if 等以 else 结尾。

因此,我最初在 if (choice2=="paper") 的第二个嵌套条件语句中使用了 else。然后意识到逻辑是错误的,因为如果它是平局,它也会打印该字符串。

所以我考虑了一下,意识到如果我使用 if 而不是 else,它会起作用。它确实有效。但是,我只是不确定我的代码是错误的……还是不够理想。是吗?

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

请原谅冗长的查询 - 我只是想确保我能很好地理解它。

谢谢

【问题讨论】:

  • 您不必以else 结尾。 ifelse if 其他都很好。
  • 我明白了。如果情况值得,这很常见吗?
  • 是的,这很正常。

标签: javascript if-statement coding-style


【解决方案1】:

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

最幼稚的选择是使用开关。例如:

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;
    }
}

但是这个版本并没有那么容易被理解 - 所以有一个比这个和第一个更好的解决方案 - 一个更清晰并且更容易让读者理解的解决方案 - 你应该尝试找到一个。

【讨论】:

  • 选项 2 中很好的 switch 解决方案。我有类似的东西,但你打败了我!
  • 谢谢!我想知道 case 在 JS 中的用法,但我还没有学习语法。不过,我还有另一个问题。本教程的大多数其他示例使用return 而不是console.log。我知道return 用于在函数中使用时返回一个值,例如一些计算的方程。但在这种情况下,我们只是简单地打印出一个字符串。在这个特定的练习中,使用return 而不是使用刚刚打印出来的东西会不会是错误的,例如console.log
  • 我个人不太喜欢将switch 语句与if...else 结构混合在一起。但是,您的第二个解决方案很好地解决了这个问题。
  • @kravoon 在大多数情况下使用 console.log 是不正确的。最好的代码是模块化的、可重用的代码。您真的应该考虑问题的目的并尝试“分离关注点”。换句话说,您的代码正在做 2 件事:1) 确定剪刀石头布游戏的获胜者 2) 记录以控制台结果实际上使用将返回获胜者结果的函数更正确,并且基于使用另一个函数将结果记录到控制台。这样,如果明天您决定改为显示警报,更改代码会更容易。
  • 当然,我上面的解释不一定与这个具体案例相关——但它更像是一种“最佳实践”,并且确实是思考一般编写代码的正确方法。
【解决方案2】:

一定要使用 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');

【讨论】:

    【解决方案3】:
    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 来检查条件。

    【讨论】:

    • 谢谢。你的第一个例子正是我最初所做的。问题在于如果choice2 是一块石头,else 块也会打印出来。你的第二个例子似乎克服了这个问题,对我来说很容易阅读。如果可以的话,我会投票,但我是这个网站的新手:P
    • 等等,你是说如果我在if(choice1 == choice2) { console.log .... 中使用return 而不是console.log,它会阻止其他语句运行,从而避免上述问题?但我认为return 应该在返回从正在执行的函数中获得的值时使用。这不是这里的情况,因为我们只是打印出一个字符串响应?
    • 对不起,我应该更清楚。想法是让compare 函数返回一个字符串,然后您将其登录到控制台。所以你会得到if(choice1 == choice2){ return "You're both psychic. It's a tie!"; }等。然后,你不仅要调用函数,还要将它记录到控制台:console.log(compare(userChoice,computerChoice));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2010-12-26
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多