为什么我的 JavaScript 开关返回 "NaN"?

Why is my JavaScript switch returning "NaN"?

我必须创建一个票价计算器,它还可以计算附加费率和金额。

我的票价开关有效,但在提示中输入大小写后,附加费率 returns 的开关为 NaN。

我已经将函数 surchargeRate(cardType) 返回的值转换为一个数字,但出于某种原因它仍然给我 NaN。

我一直在试图弄清楚问题出在哪里,但无法弄清楚。

这是我的代码:

function surchargeRate(cardType) {

  var surchargeRate;

  switch (cardType) {
    case "1":
      surchargeRate = 0.02;
      break;
    case "2":
      surchargeRate = 0.01;
      break;
  } // end switch
  return surchargeRate;
}

// This function calculates the surcharge amount.

function surchargeAmount(ticketCost, surchargeRate) {

  return ticketCost * surchargeRate;
}

function determineTicketPrice(seatingAreaCategory) {

  var ticketPrice;
  switch (seatingAreaCategory) {

    case "S":
    case "s":
      ticketPrice = 180;
      break;
    case "C":
    case "c":
      ticketPrice = 150;
      break;
    case "B":
    case "b":
      ticketPrice = 100;
      break;
    case "R":
    case "r":
      ticketPrice = 70;
      break;
    default:
      ticketPrice = 0;
      break;
  } // end switch
  return ticketPrice;
}

function totalAmount(ticketPrice, ticketQty) {

  return ticketPrice * ticketQty;
}

function validateQty(ticketQty) {

  if (ticketQty >= 1 && ticketQty <= 20) {
    return true;
  } else {
    alert("Ticket number must be between 1 and 20");
    return false;
  }
}

function init() {

  surchargeRate = surchargeRate(cardType);
  surchargeRate = Number(surchargeRate);

  var surcharge;
  var finalCost;

  if (surchargeRate == -1) {
    surchargeRate = new Error("Invalid input");
  } else {
    surcharge = surchargeAmount(ticketCost, surchargeRate);
  }

  finalCost = surcharge + ticketCost;

  var seatingAreaCategory;
  seatingAreaCategory = prompt("Please enter seating area category: ");

  var ticketPrice = determineTicketPrice(seatingAreaCategory);
  ticketPrice = Number(ticketPrice);

  var ticketQty;
  ticketQty = prompt("Please enter ticket quantity: ");
  ticketQty = Number(ticketQty);

  var ticketCost;
  ticketCost = totalAmount(ticketPrice, ticketQty);

  var cardType;
  cardType = prompt("Enter your Card type. Enter 1 for American Express and 2 for Visa/Mastercard ");

  var validQty = validateQty(ticketQty);

  console.log(cardType);
  console.log(surchargeRate);




  var seatOut = document.getElementById("seatingArea").innerHTML = "Your seating area is: " + seatingAreaCategory;
  var priceOut = document.getElementById("pricePerTicket").innerHTML = "Price per ticket: " + ticketPrice;
  var validQtyOut = document.getElementById("ticketQty").innerHTML = "Number of tickets ordered: " + ticketQty.toFixed(2);
  var beforeSurchargeOut = document.getElementById("beforeSurcharge").innerHTML = "Gross amount: " + ticketCost;
  var surchargeOut = document.getElementById("surcharge").innerHTML = "Card fee: " + surcharge;
  var costOut = document.getElementById("amountDue").innerHTML = "Amount due: " + finalCost;

}

window.onload = init;

  1. 默认值 var surchargeRate = 0;default: surchargeRate = 0;var ticketPrice = 0;
  2. 没有 var 的变量提升 - 函数 windows.surchargeRatesurchargeRate = surchargeRate(cardType);
  3. 覆盖
  4. Init 在没有任何输入的情况下进行大量计算 - 首先获取输入,然后使用它

function surchargeRate(cardType) {

  var surchargeRate;

  switch (cardType) {
    case "1":
      surchargeRate = 0.02;
      break;
    case "2":
      surchargeRate = 0.01;
      break;
  } // end switch
  return surchargeRate;
}

// This function calculates the surcharge amount.

function surchargeAmount(ticketCost, surchargeRate) {

  return ticketCost * surchargeRate;
}

function determineTicketPrice(seatingAreaCategory) {

  var ticketPrice = 0;
  switch (seatingAreaCategory) {

    case "S":
    case "s":
      ticketPrice = 180;
      break;
    case "C":
    case "c":
      ticketPrice = 150;
      break;
    case "B":
    case "b":
      ticketPrice = 100;
      break;
    case "R":
    case "r":
      ticketPrice = 70;
      break;
    default:
      ticketPrice = 0;
      break;
  } // end switch
  return ticketPrice;
}

function totalAmount(ticketPrice, ticketQty) {

  return ticketPrice * ticketQty;
}

function validateQty(ticketQty) {

  if (ticketQty >= 1 && ticketQty <= 20) {
    return true;
  } else {
    alert("Ticket number must be between 1 and 20");
    return false;
  }
}

function init() {

  var beforeSurchargeOut = document.getElementById("beforeSurcharge");
  var costOut = document.getElementById("amountDue");
  var priceOut = document.getElementById("pricePerTicket");
  var seatOut = document.getElementById("seatingArea");
  var surchargeOut = document.getElementById("surcharge");
  var validQtyOut = document.getElementById("ticketQty");


  var surcharge;
  var finalCost;
  var seatingAreaCategory;
  seatingAreaCategory = prompt("Please enter seating area category: ");

  var ticketPrice = determineTicketPrice(seatingAreaCategory);
  ticketPrice = Number(ticketPrice);

  var ticketQty;
  ticketQty = prompt("Please enter ticket quantity: ");
  ticketQty = Number(ticketQty);

  var ticketCost;
  ticketCost = totalAmount(ticketPrice, ticketQty);

  var cardType;
  cardType = prompt("Enter your Card type. Enter 1 for American Express and 2 for Visa/Mastercard ");

  var validQty = validateQty(ticketQty);

  if (surcharge == -1) {
    surcharge = new Error("Invalid input");
  } else {
    surcharge = surchargeAmount(ticketCost, surchargeRate(cardType));
  }

  finalCost = surcharge + ticketCost;


  console.log(cardType);
  console.log(surcharge);

  beforeSurchargeOut.innerHTML = "Gross amount: " + ticketCost.toFixed(2);
  costOut.innerHTML = "Amount due: " + finalCost.toFixed(2);
  priceOut.innerHTML = "Price per ticket: " + ticketPrice.toFixed(2);
  seatOut.innerHTML = "Your seating area is: " + seatingAreaCategory;
  surchargeOut.innerHTML = "Card fee: " + surcharge.toFixed(2);
  validQtyOut.innerHTML = "Number of tickets ordered: " + ticketQty;
}

window.onload = init;
<span id="beforeSurcharge"></span><br/>
<span id="amountDue"></span><br/>
<span id="pricePerTicket"></span><br/>
<span id="seatingArea"></span><br/>
<span id="surcharge"></span><br/>
<span id="ticketQty"></span><br/>