Сомневаюсь при зацикливании вне функции

Я начинаю изучать язык JavaScript, и у меня есть сомнения. Я пытаюсь сделать игру сравнения старших и младших чисел, для этого запускается приглашение, в котором вы просите написать числа, а затем сделать сравнение, которое больше, а какое наименьшее. Речь идет о том, что вместо цифр пишут буквы или текст и выдают предупреждение, что они не цифры, и попробуйте еще раз. Это запускает цикл while, но не так, как я ожидал. Почему?

var number1;
var number2;
var noNumber = false;
randomNumber();

function randomNumber () {
    number1 = prompt("Escribe un numero");
    number2 = prompt("Escribe otro numero");

    if (isNaN(number1)== true || isNaN(number2)== true) {
        alert("No son numeros");
        noNumber = true;
    } else if ( number1 > number2 ) {
        document.write( number1 + " Es el numero mayor");
        noNumber = false;
    } else if (number1 < number2) {
        document.write( number2 + " Es el numero mayor");
        noNumber = false;
    } else {
        document.write("Ningun numero es mayor");
    }
}

while ( noNumber == true ) {
    alert("Intentalo otra vez");
    randomNumber();        
}

document.write(randomNumber());
0
задан 22.03.2016, 20:17
3 ответа

Ты звонишь два раза в randomNumber() достаточно называть это единственным разом:

Кроме того он не необходим сравнивает стоимость boolean с == true достаточно только выражения, которое он возвращает bool:

Пример:

if (isNaN(number1) || isNaN(number2))

Другая ошибка, он мне кажется, чем в последнем else ему не хватает одного noNumber = false;

    var number1;
    var number2;
    var noNumber = false;
    randomNumber();

    function randomNumber () {
        number1 = prompt("Escribe un numero");
        number2 = prompt("Escribe otro numero");
  
        if (isNaN(number1) || isNaN(number2)) {
            alert("No son numeros");
            noNumber = true;
        } else if ( number1 > number2 ) {
            document.write( number1 + " Es el numero mayor");
            noNumber = false;
        } else if (number1 < number2) {
            document.write( number2 + " Es el numero mayor");
            noNumber = false;
        } else {
            document.write("Ningun numero es mayor");
            noNumber = false;
        }
    }

    while ( noNumber) {
        alert("Intentalo otra vez");
        randomNumber();        
    }
0
ответ дан 24.11.2019, 14:42

Твой недостаток проистекает, в который prompt то, что он возвращает, является string или null, а следовательно ты используешь операторы > и < на strings, что приводит тебя в неожиданное поведение, так как в javascript, если ты сравниваешь string с числом, превращается в число цепь и потом осуществляется сравнение, но если сравниваются две цепи, ты они сравнивает букву из-за буквы до тех пор, пока он не находит одну, которая была бы большей, чем другая. Прочитай http://www.w3schools.com/js/js_comparisons.asp для того, чтобы ты понял возможные изменения, что ты можешь находиться. Попробуй сравнивать 12 и 2 в твоем первоначальном алгоритме.

То, что ты должен делать, он состоит в том, чтобы обращать в число первое и потом сравнивать. Твой алгоритм могут refactorizar следующей формы.

var noNumber = false;

function randomNumber() {
  var number1 = Number(prompt("Escribe un numero"));
  var number2 = Number(prompt("Escribe otro numero"));

  if (isNaN(number1) || isNaN(number2)) {
    alert("No son numeros");
    noNumber = true;
  } else if (number1 > number2) {
    document.write(number1 + " Es el numero mayor");
    noNumber = false;
  } else if (number1 < number2) {
    document.write(number2 + " Es el numero mayor");
    noNumber = false;
  } else {
    document.write("Ningun numero es mayor");
  }
}

randomNumber();
while (noNumber) {
  alert('Intentalo de nuevo');
  randomNumber();
}

Поскольку ты будешь видеть, я использую строитель Нумбер и не parseInt, так как parseInt он конвертирует 12abc в 12 и мне кажется, что это не то, что ты хочешь. Number - немного больше escricto, и если цепи нет один строго число, возвращает NaN.

Нет необходимости писать document.write(randomNumber()); так как randomNumber у него нет никакой инструкции return и следовательно возврати undefined а следовательно ты писал бы document.write(undefined);

0
ответ дан 24.11.2019, 14:42

Сначала работает randomNumber (); 3-ьей линии (уже шага я советую тебе определять функции ПЕРЕД ТЕМ, КАК использовать их, он избавит тебе от проблем в будущем)
После, в функции, если две переменные numero1 и numero2 он будет содержать число (или совсем не), noNumber он будет false, следовательно в этом случае, закончив этот первый randomMumber, не войдет в while.
после while есть document.write (randomNumber ()); которым ejecutarà снова randomNumber, делая write внутри функцией, но поскольку он ничего не возвращает, "write" этой линии будет "undefined"
Не точно pretendías, что делал..., если ты хочешь, чтобы цикл осуществился до тех пор, пока одна из переменных не будет числом, ты мог бы делать это так:

<!DOCTYPE html>
<META charset=utf-8>

<SCRIPT>

var noNumber;

function randomNumber () {
    var number1 = prompt("Escribe un numero");
    var number2 = prompt("Escribe otro numero");
    noNumber = isNaN(number1) || isNaN(number2) || !number1 || !number2;
    if (noNumber) alert("Almenos uno de los dos no es un numero");
    else if ( number1 > number2 ) document.write( number1 + " Es el numero mayor<br>");
    else if (number1 < number2) document.write( number2 + " Es el numero mayor<br>");
    else document.write("Ningun numero es mayor<br>");
}

do {
    randomNumber(); 
    if (!noNumber) alert("Intentalo otra vez");           
}while (!noNumber)

</SCRIPT>
0
ответ дан 24.11.2019, 14:42