我正在学习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上寻找什么
答案 0 :(得分:4)
这样做的时候
switch(bill){
如果case
后面的表达式是===
到bill
的值,则将满足。例如,如果bill
为124
,则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));