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



我有一个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()总是返回一个字符串。

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

let tasks = {length: "5"}
alert("Please enter a number between 0 and " + (tasks.length-1) + ".");

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

如果没有括号,操作将从左到右进行,因此您首先连接"请输入 0 到 0 之间的数字"和(字符串)tasks.length。 然后它会尝试从中减去 1,但由于"请输入一个数字"无法转换为数字,您最终会得到NaN.最后,"."被连接到上面,产生字符串"NaN.":

let tasks = {length: "5"}
alert("Please enter a number between 0 and " + tasks.length-1 + ".");

问题是因为你有一个字符串,你需要在数字与数字(taskIndex)中转换任务索引

因为您想将输入的值用作数字,而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。 但是在转换为数字后,比较将正常工作为数字比较,而不是字符串比较。

编辑— 另一个错误:在错误alert()调用中,您必须用括号括tasks.length-1。否则,调用中的表达式将被解释为编写的表达式

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

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

最新更新