Функция JavaScript не работает должным образом с целыми числами

#javascript

#javascript

Вопрос:

У меня есть функция javascript, которая должна спрашивать пользователя, сколько продуктов он хотел бы заказать. Предполагается, что функция должна выдавать сообщение, когда они заказывают меньше одного продукта. Также предполагается, что она отправляет оповещение о «Заказе (количестве) (продукта) [ов]». Похоже, что они не работают должным образом.

Я пытался вернуть количество, но, похоже, это просто меняет веб-страницу на количество. Однако это показывает, что количество работает.

 function promptQuantity(product) {
  var quantity = prompt("How many "   product   "s would you like?");
  if (quantity > 1) {
    var plural = "s";
  }
  if (quantity = 1) {
    var plural = "";
  }
  if (quantity < 1) {
    alert("Don't be ridiculous! You can't order less than one "   product   "!");
  }
  if (quantity > 0) {
    alert("Ordering "   quantity   " "   product, plural);
  }
}
  

Я ожидаю, что эта функция отправит пользователю предупреждение о том, что они заказали количество продукта, однако она просто возвращает сообщение «Заказ 1 (продукт)»

Комментарии:

1. if (quantity = 1) неправильно, вы выполняете присваивание and, для сравнения используйте оператор if (quantity == 1) or === для строгого сравнения.

2. Вам нужно будет использовать quantity == 1 вместо quantity === 1 , поскольку quantity это строка, а не число.

3. вы можете сначала преобразовать значение в число, а затем проверить значение.

4. Это настолько очевидно! Не могу поверить, что я не заметил этого в своем коде! Спасибо за помощь, я исправлю код.

Ответ №1:

Прежде всего, вы должны использовать ‘==’ вместо ‘=’, чтобы сравнить ‘a’ и ‘b’ для равенства.

Кроме того, нет необходимости проверять ‘==’ или ‘<‘, если вы уже знаете, что ‘a’ больше, чем ‘b’, поэтому лучше использовать конструкцию if-else (или даже switch). Поэтому ее можно оптимизировать как:

 function promptQuantity(product) {
  var quantity = prompt("How many "   product   "s would you like?");
  var message = '';
  if (quantity > 1) {
    message = "Ordering "   quantity   " "   product   "s";
  } else if (quantity == 1) {
    message = "Ordering "   quantity   " "   product;
  } else {
    message = "Don't be ridiculous! You can't order less than one "   product   "!"
  }
  alert(message);
}

promptQuantity('apple');  

И с использованием switch, но у него менее очевидное действие

 function promptQuantity(product) {
  var quantity = prompt("How many "   product   "s would you like?");
  var message = '';
  switch (true) {
    case quantity > 1:
      message = "Ordering "   quantity   " "   product   "s";
      break;
    case quantity == 1:
      message = "Ordering "   quantity   " "   product;
      break;
    default:
      message = "Don't be ridiculous! You can't order less than one "   product   "!"
      break;
  }
  alert(message);
}

promptQuantity('apple');  

Комментарии:

1. switch (true) является антипаттером. Используйте if... else if инструкцию.

Ответ №2:

Фрагмент кода if (quantity = 1) неверен, вы выполняете присваивание and и quantity будет установлено значение 1 , для сравнения используйте if (quantity == 1) . Однако ваш код может быть реструктурирован следующим образом:

 function promptQuantity(product)
{
    var quantity = prompt("How many "   product   "s would you like?");
    var plural = quantity > 1 ? "s" : "";

    if (quantity < 1)
        alert("Don't be ridiculous! You can't order less than one "   product   "!");
    else
        alert("Ordering "   quantity   " "   product   plural);
}

promptQuantity("Short");  

Комментарии:

1. Попробуйте ввести что-нибудь большее 1. Она не добавит ‘s’ в конце названия продукта.

2. @VladimirNovopashin Спасибо за отзыв, я не заметил этой ошибки в исходном коде.