Почему оператор if пропускается, когда я проверяю, равна ли строка числу?

#javascript #if-statement #numbers

#javascript #оператор if #числа

Вопрос:

Я пытаюсь увидеть, равен ли пользовательский ввод числу, и если это не так, то покажите метку с надписью «Должно быть число» и не продолжайте, пока это не произойдет. Я никогда не узнавал о том, как проверить, равна ли строка числу, поэтому я искал его и добавил в свой код, но он по-прежнему не работает. Может кто-нибудь взглянуть на это и сказать мне, как я могу исправить свое if-условие? Заранее спасибо!

 //variable that is used
var user_answer = getNumber("answer_input");

//Confirm your answer with clicking the button
onEvent("attackBttnForEquation", "click", function( ) {
  if (isNaN("user_answer") === false){ //here is where I tried to use it, but it just skips the condition
    showElement("mustBeNum_label");
    setTimeout(function(){
    hideElement("mustBeNum_label");
  }, 1000);
  }
 setScreen("play_screen");
 hideElement("fight_symbol");
 checkAnswer();
 checkLose();
});
 

Это то, что я пробовал на основе комментария, и это все равно не сработало:

 onEvent("attackBttnForEquation", "click", function( ) {
  if (isNaN(user_answer) === true){ //I forgot to specify that user_answer is a variable, but I even set the condition to equal to true and it did the same thing as before.
    showElement("mustBeNum_label");
    setTimeout(function(){
    hideElement("mustBeNum_label");
  }, 1000);
  }
 

Хорошо, с полученным мной ответом отображается «mustBeNum_label», НО когда пользователь вводит фактическое число, он все равно показывает «mustBeNum_label».

 //Confirm your answer with clicking the button
onEvent("attackBttnForEquation", "click", function( ) {
  if (Number(user_answer)){
    setScreen("play_screen");
      hideElement("fight_symbol");
      checkAnswer();
      checkLose();
  } else {
    showElement("mustBeNum_label");
    setTimeout(function(){
    hideElement("mustBeNum_label");
  }, 1000);
  }
});
 

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

1. строка «user_answer» не является числом (NaN), поэтому она true, а не false

Ответ №1:

Попробуйте проверить следующим образом:

 if (Number(user_answer) || user_answer == 0) {
  // input is a number
} else {
  // input is not a number
}
 

Вы можете узнать больше здесь: Number — MDN

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

1. Спасибо за ответ, «mustBeNum_label» показывает, когда это не число. Но когда пользователь вводит фактическое число, оно все равно показывает метку.

2. Поместите консоль. войдите в оператор if и else, проверьте, что срабатывает, а что нет. В качестве альтернативы, распечатайте пользовательский ввод перед передачей его в Number()

Ответ №2:

Я бы счел это плохим случаем Number() , поскольку он будет выводить NaN or a number .

Подумайте, когда вы столкнетесь 0 : условие будет запускать ваш блок else, поскольку 0 оно является ложным.

Number.isInteger(Number(user_input)) может быть лучшим решением, поскольку оно всегда будет выводить логическое значение, и если оно будет передано NaN , будет выводить false.

Более короткий синтаксис будет Number.isInteger( user_input)

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

1. Я согласен, что мое решение не будет работать должным образом, когда пользователь вводит 0. И ваш подход кажется здесь более подходящим. Однако Number.isInteger() не будет работать для нецелых чисел. И в NaN выводе нет ничего плохого, поскольку он считается ложным. ИМХО, добавления еще одной проверки на ноль должно быть достаточно.

2. Я перешел к параметру, Number.isInteger чтобы принудительно преобразовывать любые числа в строки в числа, просто чтобы учесть эту возможность.