Если оператор отображает сообщение NaN вместо пользовательского предупреждения - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть оператор if, который проверяет, является ли число, которое вводит пользователь, числом от 0 до последнего индекса массива. Когда я ввожу что-то отличное от числа, вместо перехода к части кода else и отображения сообщения с предупреждением отображается «NaN».

$("#delete_task").click(function() {   
        var taskIndex = prompt("Please enter the index number of the task to delete.",0);
        if(!isNaN(taskIndex) && taskIndex >= 0 && taskIndex < tasks.length) {
            tasks.sort();
            tasks.splice(taskIndex, 1);
            displayTaskList();
        } else {
            alert("Please enter a number between 0 and " + tasks.length-1 + ".");
        }
    });

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

prompt() всегда возвращает строку.

Вычитание будет пытаться привести строки к числам, поэтому один из способов исправить это - просто убедиться, что это происходит перед сложением (объединением) в остальной части предупреждения:

let tasks = {length: "5"}

alert("Please enter a number between 0 and " + (tasks.length-1) + ".");

Здесь круглые скобки работают точно так же, как в математическом уравнении: они контролируют порядок операций.В приведенных выше скобках tasks.length - 1 происходит первым, и поскольку это вычитание, переменная (которая, как мы знаем, содержит только числовые символы из-за более раннего теста isNaN()) успешно преобразуется в число.Затем с результатом выполняются операции «сложения» (в порядке слева направо), которые случайно преобразуют его обратно в строку.

Без скобок операция будет выполняться слева направо, поэтому сначалаконкатенация «Пожалуйста, введите число от 0 до» и (строка) tasks.length.Затем он попытается вычесть 1 из этого числа, но поскольку «Пожалуйста, введите число» не может быть преобразовано в число, вы получите NaN.Наконец, "."соединяется с этим, в результате получается строка «NaN.»:

let tasks = {length: "5"}

alert("Please enter a number between 0 and " + tasks.length-1 + ".");
0 голосов
/ 29 апреля 2019

Проблема в том, что у вас есть строка, вам нужно конвертировать taskIndex в число с номером (taskIndex)

0 голосов
/ 29 апреля 2019

Поскольку вы хотите использовать введенное значение в качестве числа, а prompt() всегда возвращает строку, вам необходим дополнительный шаг для преобразования ответа на приглашение в число:

$("#delete_task").click(function() {   
    var taskIndex = prompt("Please enter the index number of the task to delete.",0);
    taskIndex = Number(taskIndex); // or +taskIndex
    if(!isNaN(taskIndex) && taskIndex >= 0 && taskIndex < tasks.length) {
        tasks.sort();
        tasks.splice(taskIndex, 1);
        displayTaskList();
    } else {
        alert("Please enter a number between 0 and " + (tasks.length-1) + ".");
    }
});

Проверка isNaN() все еще будет работать, потому что если вы введете "foo" в диалоговое окно приглашения, преобразование приведет к NaN. Но после преобразования в число сравнения будут работать как числовые сравнения вместо сравнения строк.

изменить & mdash; еще одна ошибка: при ошибке alert() call необходимо заключить в скобки tasks.length-1. Если нет, выражение в вызове интерпретируется так, как если бы оно было написано

(("Please enter a number between 0 and " + tasks.length) - 1) + "."

Оператор вычитания всегда пытается преобразовать свои аргументы в числа, и ясно, что результатом начального сложения string будет NaN. Я исправил пример кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...