为什么我在switch语句中得到不同的结果

时间:2019-07-10 07:45:57

标签: javascript

我正在学习JavaScript,目前正在使用function和switch语句构建简单的提示计算器。基本上,当账单少于$ 50时,付小费的20%;当账单在$ 50到$ 200之间时,付小费的15%;如果账单大于$ 200,则付小费的10%。示例输入/参数:

simpleTipCalculator(124)
simpleTipCalculator(48)
simpleTipCalculator(268)

如果您手动进行计算,则结果(预期结果):

18.599999999999998
9.600000000000001
26.8

到目前为止,这是我的代码:

function simpleTipCalculator(bill){
    let tip = 0
    switch(bill){
        case bill > 0 && bill < 50:
            tip = bill * 0.2
            break;
        case bill >= 50 && bill <= 200:
            tip = bill * .15
            break;
        default:
            tip = bill * .1

    }
    console.log(tip)
}

以及此函数的结果:

12.4
4.800000000000001
26.8

对此我感到困惑,然后将代码更改为此:

function simpleTipCalculator(bill){
        let tip = 0
        switch(true){
            case bill > 0 && bill < 50:
                tip = bill * 0.2
                break;
            case bill >= 50 && bill <= 200:
                tip = bill * .15
                break;
            default:
                tip = bill * .1

        }
        console.log(tip)
    }

结果是我所期望的。

18.599999999999998
9.600000000000001
26.8

我的问题是这是怎么发生的?请为我解释一下,因为我不知道要在Google上寻找什么

3 个答案:

答案 0 :(得分:4)

这样做的时候

switch(bill){

如果case后面的表达式是===bill的值,则将满足。例如,如果bill124,则switch(bill)将要求

case: 124:
    tip = bill * .15 // because 124 <= 200

使程序按预期运行。您的代码产生了意外的结果,因为所有case都失败了,并且落入了default

switch(true)之所以有效,是因为当您遇到以下情况时

case bill > 0 && bill < 50:

这将有效地评估为

case true
// block below will run, because `true` is `===` to the expression that was switched against

case false:
// block below will not run, because `false` is `!==` to the expression that was switched against

并相应地运行case块。

switch不是适合该工作的工具,IMO –它令人困惑且冗长。 (我认为,它永远不是Java语言中任何编程任务的正确工具。)我将改用if / else

const getTip = (bill) => {
  if (bill > 0 && bill < 50) {
    return bill * 0.2;
  } else if (bill >= 50 && bill <= 200) {
    return bill * 0.15;
  } else {
    return bill * 0.1;
  }
};

function simpleTipCalculator(bill) {
  console.log(getTip(bill));
}

simpleTipCalculator(124)
simpleTipCalculator(48)
simpleTipCalculator(268)

答案 1 :(得分:1)

开关盒无法正常使用。

switch(test){
    case a:
        break;
    case b:
        break;
    case c:
        break;
}

test的值与a的值进行比较,然后将b的值进行比较,依此类推

因此在您的第一个代码示例中,它会进行比较 124,其值为(bill > 0 && bill < 50)的{​​{1}}

因此您正在将整数与布尔值进行比较。
要使范围有效,您必须像第二个示例中一样。

我发现了Stackoverflow帖子:https://stackoverflow.com/a/5619997/7584725

答案 2 :(得分:1)

这是因为您正在将帐单是数字switch(bill)布尔 case: ...(如果是if语句)进行比较。由于任何比较都会失败,因此这将始终导致默认设置。您需要将开关更改为switch(!!bill)或简单地更改为switch(true)

function simpleTipCalculator(bill){
    let tip = 0
    switch(!!bill) {
        case (bill > 0 && bill < 50):
            tip = bill * 0.2
            break;
        case (bill >= 50 && bill <= 200):
            tip = bill * .15
            break;
        default:
            console.log('default');
            tip = bill * .1
    }
    return tip;
}

console.log(simpleTipCalculator(124));