If 语句显示 NaN 消息而不是自定义警报

If statement displaying a NaN message instead of custom alert

我有一个 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 + ".");
        }
    });

因为您想将输入的值用作数字,而 prompt() 始终是 returns 字符串,因此您需要额外的步骤将提示响应转换为数字:

$("#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。但是在转换为数字后,比较将作为 numeric 比较而不是字符串比较正常工作。

edit — 另一个错误:在错误 alert() 调用中,您必须使用括号 tasks.length-1。如果不这样做,调用中的表达式将被解释为就好像它被写成

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

减法运算符总是试图将其参数转换为数字,显然初始 string 加法的结果最终将是 NaN。我已经修复了示例代码。

prompt()总是returns一个字符串。

减法会尝试将字符串强制转换为数字,因此纠正此问题的一种方法是确保在警报的其余部分中发生在加法(串联)之前:

let tasks = {length: "5"}

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

此处括号的作用与数学方程式完全相同:它们控制运算顺序。对于上面的括号,tasks.length - 1 首先发生,并且因为它是减法变量(我们知道它只包含数字字符,因为之前的 isNaN() 测试)被成功地强制转换为一个数字。然后对结果进行 "addition" 操作(按从左到右的顺序),顺便将其转换回字符串。

如果没有括号,运算将从左到右进行,因此您首先要连接 "Please enter a number between 0 and " 和(字符串)tasks.length。然后它会尝试从中减去 1,但是因为 "Please enter a number" 不能转换成数字,所以你最终得到 NaN。最后是“.”连接到它上面,产生字符串 "NaN.":

let tasks = {length: "5"}

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

问题是因为你有一个字符串,你需要将 taskIndex 转换为 Number(taskIndex)