微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript-函数问题

如何解决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的情况是“失败”,例如一直执行直到碰到breakreturnswitch的结尾,所以:

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

请注意,您的逻辑有误,如果amount200,则不会匹配 任何东西,然后使用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 举报,一经查实,本站将立刻删除。