如何解决JavaScript-函数问题
我是使用JavaScript的新手,正在尝试完成以下练习:
我有一个名为bill
的数组,其中包含3个元素[124,48,268]
我想调用一个函数,该函数根据账单金额,小于$ 50(百分比= 0.2),介于$ 50和$ 200之间的账单金额(百分比= 0.15)和大于$ 200的账单金额(百分比= 0.1)来计算小费
我使用了以下代码:
var bill = [124,268];
var percCalculation = function(amount) {
var percentage;
switch(amount) {
case (amount < 50):
percentage = .2;
case (amount >= 50 && amount < 200):
percentage = .15;
case (amount > 200):
percentage = .1;
}
return percentage * amount
}
var tipAmount = [percCalculation(bill[0]),percCalculation(bill[1]),percCalculation(bill[2])];
console.log(tipAmount);
但是,我得到以下结果:(3) [NaN,NaN,NaN]
代码有什么问题?
解决方法
请记住switch
的情况是“失败”,例如一直执行直到碰到break
,return
或switch
的结尾,所以:
var percCalculation = function(amount) {
var percentage;
switch(amount) {
case (amount < 50):
percentage = .2;
break;
case (amount >= 50 && amount < 200):
percentage = .15;
break;
case (amount > 200):
percentage = .1;
break;
}
return percentage * amount
}
var bill = [124,48,268];
var tipAmount = [percCalculation(bill[0]),percCalculation(bill[1]),percCalculation(bill[2])];
console.log(tipAmount);
虽然可以解决掉线问题,但它暴露出另一个更严重的问题
就是case
值是通过匹配评估的,就像amount
一样
必须与这些case
表达式的完全评估版本之一匹配,
所以看起来像这样:
switch(amount) {
case true:
// ...
case false:
// ...
case false:
// ...
}
因此必须将其转换为if
条语句:
var percCalculation = function(amount) {
var percentage;
if (amount < 50)
percentage = .2;
if (amount >= 50 && amount < 200)
percentage = .15;
if (amount > 200)
percentage = .1;
return percentage * amount;
}
var bill = [124,percCalculation(bill[2])];
console.log(tipAmount);
请注意,您的逻辑有误,如果amount
为200
,则不会匹配
任何东西,然后使用undefined
值相乘就会崩溃。我更喜欢
使用更多数据驱动的定义,例如:
percentageForAmount = [
[ 200,0.1 ],[ 50,0.15 ],[ 0,0.2 ]
];
您可以在其中轻松查找值的地方:
let rate = percentageForAmount.find((min,perc) => amount > min);
let percentage = rate[1];
还值得注意的是,通常最好将函数定义为函数,而不是定义为var
变量。没有任何理由,没有理由每次运行时都要重新定义它。
换句话说:
function percCalculation(amount) {
// ...
}
您可以在任意位置多次拨打该电话,而不会产生任何额外费用。
,您的第一个金额的switch语句124看起来
var percentage = undefined; // implied value of undeifned
switch(124) {
case false: ......
case true: ....
case false: ....
}
return 124 * undefined; // this is Nan
由于没有个案匹配124,所以百分比永远不会得到值,结果是NaN
因此,您想switch(true)
,因为只有一种情况是正确的
您还希望在每种情况下都break
,以使执行不会“陷入”下一种情况
有一点好处,您的函数可用作Array#map方法的回调-请参见代码段底部
var percCalculation = function(amount) {
var percentage;
switch(true) {
case (amount < 50):
percentage = .2;
break;
case (amount >= 50 && amount < 200):
percentage = .15;
break;
case (amount > 200):
percentage = .1;
break;
}
return (percentage * amount).toFixed(2) // returns a nice dollar and cents
}
var bill = [124,percCalculation(bill[2])];
console.log(tipAmount);
// bonus ... use map to make your code "DRY"
var tip2 = bill.map(percCalculation);
console.log(tip2);
请注意:您的逻辑将意味着,如果金额恰好是200,您将获得NaN结果...您需要检查 = 200(在第三种情况下)完成了50截止)
关于switch的上述用法的简短说明...许多语言都有switch
,但不允许多个case
具有相同的值-javascript允许(不确定其他哪种语言允许)因此,请谨慎使用其他语言
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。