为什么我收到javascript NaN错误消息?

时间:2015-10-27 16:36:11

标签: javascript

为我的javascript类简介做一个项目,并且无法弄清楚为什么这不起作用。谁能帮我吗?这是我的作业代码。

//Declare variables
var guestsPerRoom;
var discount;
var goodView;
var totalCost;
var costPerNight;
var membership;

//prompt user to enter info based on their needs
guestsPerRoom = prompt("How many guests will be staying in this room? (Max 6)");
discount = prompt("Are you a member of AAA?");
goodView = prompt("Would you like a room with a good view? (10% Price Increase)");

//Calculate guests needs to total cost
totalCost = Number(totalCost);
discount = Number(discount);
costPerNight = Number(costPerNight);

//Output users total cost
if (guestsPerRoom === 1 || guestsPerRoom === 2) {
  costPerNight = 50;
  if (membership === 'Y') {
    discount = costPerNight * 0.85;
  }
  else if (membership === 'N') {
    discount = costPerNight;
  }
  if (goodView === 'Y') {
    totalCost = costPerNight * discount * 1.1;‹
  }
  else if (goodView === 'N') {
    totalCost = costPerNight * discount;
  }
}
 document.write("Total cost per night is $" + totalCost);

当我运行该程序时,我希望得到“每晚总费用为50美元(或总费用)。”有人能告诉我我做错了吗?我的猜测是我的总成本变量没有定义,但我无法弄清楚。

5 个答案:

答案 0 :(得分:4)

问题是您正在尝试将这两个问题转换为数字非数字答案:

discount = prompt("Are you a member of AAA?");
goodView = prompt("Would you like a room with a good view? (10% Price Increase)");

discount = Number(discount);
costPerNight = Number(costPerNight);

当然,这些答案不是数字。因此错误。

答案 1 :(得分:2)

看起来像是

discount = prompt("Are you a member of AAA?");

应该是

membership = prompt("Are you a member of AAA?");

因为你有

 if (membership === 'Y') {

但您从未设置成员资格变量。然后你只需删除这一行:

discount = Number(discount);

答案 2 :(得分:1)

此代码存在一些问题。首先,guestsPerRoom从提示中获取字符串值,因此三重===严格'如果将操作员与数字进行比较,操作员将无法工作。您要么必须确保它们是相同的类型(字符串或两者都是),要么使用非严格比较==

然后,membership在开始在ifs中使用它之前没有获得值,因为您将提示的结果存储在discount中。

此外,totalCost = Number(totalCost)会导致totalCost变为NaN,因为您之前没有给它一个值。由于其他变量也没有,或不正确或意外,因此永远不会输入if树,totalCost永远不会获得与最初收到的NaN不同的值。这就是你在输出中看到NaN的原因。

建议提示:使用console.log(totalCost)检查totalCost(当然其他变量也是如此)。您可以在代码中输入几行,以便将这些值输出到控制台(按F12将其打开)。这样,您可以检查值和代码路径,而不会阻止执行。您也可以使用调试器来逐步执行代码,但这有点难以掌握。

答案 3 :(得分:1)

prompt返回的值是一个字符串(如果取消则返回null),因此当您尝试使用===将值与数字进行比较时,它将不匹配。

您可以使用==运算符进行类型宽松比较,但最好将数字作为数字而不是字符串处理。将值解析为数字,然后比较它们的方式将起作用:

guestsPerRoom = parseInt(prompt("How many guests will be staying in this room? (Max 6)"), 10);

您将成员资格问题的结果分配给discount变量,它应该是:

membership = prompt("Are you a member of AAA?");

在接下来的几行中,您可以将totalCostdiscountcostPerNight中的值转换为数字,但您还没有为它们分配任何内容(除了已分配成员资格的折扣)值)。

当您设置discount值时使用costPerNight,但稍后将该值与costPerNight相乘,这样会使总费用成为costPerNight的平方。只需将折扣因子分配给变量:

if (membership === 'Y') {
  discount = 0.85;
}
else if (membership === 'N') {
  discount = 1.0;
}

答案 4 :(得分:0)

您必须检查输入是否为数字,因为您使用的是“===”,它关注var的类型,因此您需要确保验证用户输入。任何文本输入或“怪异”输入都会导致'NaN'类型。