【问题标题】:JS function create and push into array - only first element is NaNJS 函数创建并推入数组 - 只有第一个元素是 NaN
【发布时间】:2019-03-08 10:08:24
【问题描述】:
var tipsArray = [];
var finalBillArray = [];
var tip;
var finalBill;

function calculator(bill) {
    finalBill = tip + bill;

    if (bill < 50) {
        tip = bill * 0.2;
    } else if (bill >= 50 && bill <= 200) {
        tip = bill * 0.15;
    } else {
        tip = bill * 0.1;
    }

    tipsArray.push(tip);
    finalBillArray.push(finalBill);

    }

calculator(124);
calculator(48);
calculator(268);

console.log(tipsArray);
console.log(finalBillArray);

我正在尝试解决 UDEMY 课程中的一项任务。并且无法理解,为什么finalBillArray中只有第一个元素是NaN,而其他的看起来都不错。

【问题讨论】:

  • 变量tip未定义,将未定义添加到数字会导致NaN。要修复它,用 0 初始化 tip 变量

标签: javascript arrays variables push nan


【解决方案1】:

在您当前的代码中,直到 if (bill... 测试 calculator 内的 tip 才会分配给 finalBill在下面分配给 finalBill。分配给finalBill 创建tip 之后,这不仅会导致没有NaNs,而且还会为您提供准确的结果(您当前的提示每张账单都是根据上一个账单的小费计算的,而不是当前账单):

var tipsArray = [];
var finalBillArray = [];

function calculator(bill) {

  var tip;
  var finalBill;
  if (bill < 50) {
    tip = bill * 0.2;
  } else if (bill >= 50 && bill <= 200) {
    tip = bill * 0.15;
  } else {
    tip = bill * 0.1;
  }

  tipsArray.push(tip);
  finalBill = tip + bill;
  finalBillArray.push(finalBill);

}

calculator(124);
calculator(48);
calculator(268);

console.log(tipsArray);
console.log(finalBillArray);

如果你不喜欢那里的浮点数,你也可以使用Math.roundMath.round(tip * 100) / 100; 将四舍五入到小数点后 2 位。 (如果不需要号码,可以改用toFixed(2),更方便)

var tipsArray = [];
var finalBillArray = [];

function calculator(bill) {

  var tip;
  var finalBill;
  if (bill < 50) {
    tip = bill * 0.2;
  } else if (bill >= 50 && bill <= 200) {
    tip = bill * 0.15;
  } else {
    tip = bill * 0.1;
  }
  tip = Math.round(tip * 100) / 100;

  tipsArray.push(tip);
  finalBill = tip + bill;
  finalBillArray.push(finalBill);

}

calculator(124);
calculator(48);
calculator(268);

console.log(tipsArray);
console.log(finalBillArray);

【讨论】:

  • 在哪里定义你应该在每次计算时重置tip
  • if(bill 条件下,无论采用哪条路径,tip 都必须重新分配。
  • 我确定你应该在计算器范围之外设置var tip
  • 不,最好将变量限制在尽可能小的范围内。 tip 不能在calculator 之外使用,所以tip 应该定义在calculator 内部,而不是外部。
【解决方案2】:

只有一个变化:var tip = 0;

var tipsArray = [];
var finalBillArray = [];
var tip = 0;
var finalBill;

function calculator(bill) {
    finalBill = tip + bill;

    if (bill < 50) {
        tip = bill * 0.2;
    } else if (bill >= 50 && bill <= 200) {
        tip = bill * 0.15;
    } else {
        tip = bill * 0.1;
    }

    tipsArray.push(tip);
    finalBillArray.push(finalBill);

    }

calculator(124);
calculator(48);
calculator(268);

console.log(tipsArray);
console.log(finalBillArray);

【讨论】:

  • 为什么?没有任何描述@sagi
  • 想一想,你去餐厅,小费是按上次来的?
  • 在哪个国家?
  • 在每个国家/地区
  • 似乎人们同意我的观点。
【解决方案3】:

只有在计算/初始化后才能使用提示。

finalBill = tip + bill;

您使用的是 tip 而不初始化它,因此 - NUM + NAN = NAN

function calculator(bill) {
    if (bill < 50) {
        tip = bill * 0.2;
    } else if (bill >= 50 && bill <= 200) {
        tip = bill * 0.15;
    } else {
       tip = bill * 0.1;
    }
    finalBill = tip + bill;
    tipsArray.push(tip);
    finalBillArray.push(finalBill);

    }

【讨论】:

  • 我可以对您的代码说同样的话。这在逻辑上是错误的,因为它改变了最初作者的逻辑。
  • 想一想,你去餐厅,小费是按上次来的?
【解决方案4】:

你的问题是你的tip变量在你调用函数时没有初始化,换句话说它是undefined,所以当你调用时:

finalBill = tip + bill;

它将返回NaN,因为undefined+bill 不是有效的Number

解决方案:

您只需将finalBill = tip + bill; 行放在if 块之后,即可正确初始化tip 变量。

if (bill < 50) {
    tip = bill * 0.2;
} else if (bill >= 50 && bill <= 200) {
    tip = bill * 0.15;
} else {
    tip = bill * 0.1;
}
finalBill = tip + bill;

演示:

var tipsArray = [];
var finalBillArray = [];
var tip;
var finalBill;

function calculator(bill) {

    if (bill < 50) {
        tip = bill * 0.2;
    } else if (bill >= 50 && bill <= 200) {
        tip = bill * 0.15;
    } else {
        tip = bill * 0.1;
    }
    finalBill = tip + bill;

    tipsArray.push(tip);
    finalBillArray.push(finalBill);

    }

calculator(124);
calculator(48);
calculator(268);

console.log(tipsArray);
console.log(finalBillArray);

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2022-01-23
    • 2022-11-12
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多